`

java 创建一个对象 Cloneable

    博客分类:
  • java
阅读更多

 

               JAVA 创建对象的几种方式:

 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class Obj {

 public static void main(String[] args)
   throws CloneNotSupportedException,
   ClassNotFoundException,
   IllegalAccessException,
   InstantiationException,
   NoSuchFieldException,
   NoSuchMethodException,
   InvocationTargetException,
   IOException{
  //1.使用new 创建一个对象
  User u1=new User();
  Addr a1=new Addr();
  u1.setAddr(a1);
  u1.setAge(1);
  u1.setName("user1");
  a1.setCod("a1");
  a1.setAddress("海淀");
  
  System.out.println("1.使用new创建一个对象   " + u1.toString());
  System.out.println();
 
  //2.使用clone创建一个对象(深度克隆)
  User u2=(User)u1.clone();
  Addr a2=u2.getAddr();
  a2.setCod("a2");
  u2.setName("user2");
  System.out.println("2.2使用clone创建一个对象   " + u2.toString());
  System.out.println("2.3使用clone创建一个对象  " + u1.toString()); //Addr 对象如果clone
  
  //3.反射:利用java.lang.Class 或者 java.lang.reflect.Constructor.newInstance()
  Class c3=Class.forName("jav.User");
  printClass(c3);
  User u3=(User)c3.newInstance();
  Addr a3=u3.getAddr();
  Field field= c3.getDeclaredField("addr");
  String methodName = "set" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);
  System.out.println("methodName = "+ methodName);
  Method m=c3.getMethod(methodName, Addr.class);
  
  a3= new Addr();
  a3.setCod("A33");
  Object o=m.invoke(u3, a3); //o是返回值 , User实例通过依赖注入把一个新的对象注入addr属性中
  System.out.println(u3.getAddr() + u3.getAddr().getCod());
  //System.out.println("a3 = null: "+ (a3==null));//true
  u3.setAddr(new Addr());
  System.out.println("3.反射:利用java.lang.Class创建一个对象 " + u3.toString());
  System.out.println("3.2反射:利用java.lang.Class 使用Method.invoke() 实现注入属性对象");
  
  
  Constructor[] cons= User.class.getDeclaredConstructors();//获取默认构造函数
  User u4=null;
  for(int i=0;i<cons.length;i++){
   Class[] paraC=cons[i].getParameterTypes();
   //System.out.println(paraC.length); //默认构造函数 参数为0
   if(paraC.length==0){//默认构造函数
    //System.out.println(cons[i]);
    u4=(User)cons[i].newInstance();
    System.out.println("u4=" +u4.getName() + "addr ="+u4.getAddr());
    //break;
   }
   else if(paraC.length==3){
    Addr a4=new Addr();
    a4.setCod("A44");
    u4=(User)cons[i].newInstance("abc", 12, a4);
    System.out.println("u4=" +u4.getName()+ " addr="+u4.getAddr());
   }
  }
  
  System.out.println("3.3反射 使用java.lang.reflect.Constructor(构造函数)创建一个对象");
  
  //4.反序列化,java.io.ObjectInputStream.readObject()
//  ObjectOutputStream os=new ObjectOutputStream(new FileOutputStream(new File("c:\\BAK\\test.txt")));
//  os.writeObject(u1);//java.io.NotSerializableException
//  os.close();
  
  ObjectInputStream is=new ObjectInputStream(new FileInputStream(new File("c:\\BAK\\test.txt")));
  User u5= (User)is.readObject();
  is.close();
  
  System.out.println("4.反序列化,java.io.ObjectInputStream.readObject 创建一个对象   "+u5);
 }
 
 
 static void printClass(Class c)
   throws IllegalAccessException,
   InstantiationException{
  StringBuffer sb=new StringBuffer(256);
  
  sb.append("name = ")
  .append(c.getName())
  .append("\n")
  .append("simpleName = ")
  .append(c.getSimpleName())
  .append("\n")
  .append("classLoader = ")
  .append(c.getClassLoader())
  .append("\n")
  .append("fields = ");
  
  Field[] fields=c.getDeclaredFields();
  for(int i=0;i<fields.length;i++){
   sb.append(fields[i].getName())
   .append(" ")
   .append(fields[i].getGenericType())
   .append("  ");
   
   //处理addr=null
//   if("class jav.Addr".equals(fields[i].getGenericType())){
//    System.out.println(1000);
//   }
   
   Class c6= fields[i].getType();
   
   if("Addr".equals(c6.getSimpleName())){
    Addr aa=(Addr)c6.newInstance();
   }
  }
  sb.append("\n");
  
  Method[] methods=c.getMethods();
  sb.append("method = ");
  for(int i=0;i<methods.length;i++){
   sb.append(methods[i].getName());
   sb.append(" ");
   
   //method
   //methods[i].invoke(obj, args)
  }
  sb.append("\n");
  
  sb.append("Constructors = ");
  Constructor[] cons=c.getDeclaredConstructors();
  for(int i=0;i<cons.length;i++){
   sb.append(cons[i].getName());
  }
  System.out.println(sb.toString());
 }

}


class User implements Cloneable,Serializable{
 private String name;
 private int age;
 private Addr addr; //Addr 实现Cloneable 深度克隆
 
 public User(){
  
 }
 
 public User(String name,int age, Addr addr){
  this.name=name;
  this.age=age;
  this.addr=addr;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Addr getAddr() {
  return addr;
 }
 public void setAddr(final Addr addr) {
  //addr=new Addr();
  this.addr = addr;
 }
 
 public String toString() {
  StringBuilder sb=new StringBuilder();
  sb.ensureCapacity(256);
  sb.append("name: ")
  .append(this.getName())
  .append(" ")
  .append("age: ")
  .append(this.getAge())
  .append(" ")
  .append("addr: ")
  .append(this.getAddr().getCod())
  .append(" ")
  .append(this.getAddr().getAddress());
  
  return sb.toString();
 }

 protected Object clone() throws CloneNotSupportedException {
  User u=(User)super.clone();
  
  //克隆Addr
  u.addr=(Addr)addr.clone();
  return u;
 }
 
 
}

class Addr implements Cloneable,Serializable{
 private String cod;
 private String address;
 
 public String getCod() {
  return cod;
 }
 public void setCod(String cod) {
  this.cod = cod;
 }
 public String getAddress() {
  return address;
 }
 public void setAddress(String address) {
  this.address = address;
 }

 protected Object clone() throws CloneNotSupportedException {
  Addr a=(Addr)super.clone();
  return a;
 }
 
 
}

分享到:
评论

相关推荐

    JAVA创建对象的四种方法

    - clone() 方法是 Java 中的一个方法,它可以创建对象的拷贝,但是需要实现 Cloneable 接口,clone() 方法可以创建浅拷贝或深拷贝,浅拷贝只拷贝对象的引用,而深拷贝则拷贝对象的所有成员变量。 - 序列化机制是 ...

    java四种创建对象的方式

    克隆方法创建对象是指利用对象自身的clone方法创建一个与原来对象内容相同的对象。这种方式不会调用原对象的构造方法。为了让一个类支持克隆操作,该类需要实现Cloneable接口。实现Cloneable接口的clone方法需要抛出...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    这篇博文“MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象”探讨的是如何在Java编程中实现对象属性的深度复制。MyBatis是一个流行的Java持久层框架,它简化了数据库操作,而对象复制则是处理业务...

    java 对象克隆

    在Java编程语言中,对象克隆是一种创建一个与原对象具有相同数据的新对象的过程。对象克隆主要用于复制或备份对象,以便在不干扰原始对象的情况下对其进行修改或操作。本篇文章将详细探讨Java中的对象克隆及其实现...

    java创建对象的五种方法demo

    如果一个类实现了`Cloneable`接口并重写了`clone()`方法,那么可以通过`clone()`创建对象的副本。例如: ```java class CloneExample implements Cloneable { // ... @Override protected Object clone() ...

    java不同对象及集合的多次复制

    - **浅拷贝**:创建一个新的对象,只复制对象的引用,不复制内部引用的对象。这意味着改变其中一个对象的内部引用对象,会影响另一个对象。 - **深拷贝**:创建一个全新的对象,不仅复制对象本身,还递归复制其...

    Java创建对象的5种方式.java

    如果一个类实现了`Cloneable`接口并覆盖了`Object`类中的`clone()`方法,我们就可以通过`clone()`方法创建对象的副本。请注意,正确实现`clone()`方法需要谨慎处理,以确保复制的数据也正确复制。例如: ```java ...

    JAVA_对象克隆

    1. 浅克隆:默认的`clone()`方法执行的是浅克隆,它创建的新对象只复制原始对象的基本数据类型字段,对于引用类型的字段,新对象和原始对象共享同一个引用。这意味着对引用对象的修改会影响到原始对象。 2. 深克隆...

    Java对象的复制克隆

    总之,Java中的对象复制与克隆是程序设计中重要的概念,它提供了创建对象副本的能力,而不会影响原始对象的状态。浅拷贝适用于简单的对象,而深拷贝则用于处理复杂的数据结构,确保对象之间的独立性。在实际应用中,...

    java创建者模式实例

    1. 创建者类(Creator):这是核心类,它定义了创建对象的接口,但具体的创建过程由其实现类完成。 2. 具体创建者类(Concrete Creator):实现了创建者类的接口,负责实际的创建工作。 3. 原型接口(Prototype):...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

    Java创建对象的四种方法[借鉴].pdf

    如果一个类实现了`Cloneable`接口,那么可以通过调用`clone()`方法创建对象的副本。`clone()`方法创建的是浅复制,也就是说,如果对象的属性包含其他对象,那么这些对象不会被复制,而是共享同一引用。在深复制中,...

    《剑指offer》Java创建对象的五种方式.pdf

    根据标题和描述,我们将详细探讨Java创建对象的五种主要方式。 1. **使用`new`关键字创建对象** 这是最常见的创建对象的方式,通过调用类的构造器来实例化对象。例如: ```java Object obj = new Object(); ```...

    Java-Java面向对象中引用传递教程

    在Java编程语言中,面向对象特性是其核心概念之一,其中引用来传递对象是一个非常重要的知识点。本教程将深入探讨Java中的引用传递机制,并通过视频教程的形式帮助学习者更好地理解和应用这一概念。 首先,理解...

    如何进行Java对象的克隆.pdf

    "Java 对象克隆详解" Java 对象克隆是 Java 编程中一个重要的概念。由于 Java 中的对象使用引用...Java 对象克隆是 Java 编程中一个重要的概念,它可以帮助我们创建对象的副本,并且可以帮助我们避免对象状态的修改。

    Java中对象的生命周期 ..doc

    - 如果一个类没有定义任何构造函数,则系统会自动提供一个无参的默认构造函数。 - 如果类中至少定义了一个构造函数,则不再提供默认构造函数。 4. **私有构造函数**: - 私有构造函数只能在当前类内部使用。 - ...

    java面向对象之JVM创建及分配策略方法详解.docx

    在Java中,主要有以下几种创建对象的方式: - **new关键字**:这是最常见的创建对象的方式,通过new关键字和类的构造函数来创建。 - **反射**:利用java.lang.reflect包中的Class和Constructor类,动态地创建对象...

    java中的指针,引用及对象的clone

    在Java中,当使用`new`关键字创建一个对象时,实际上创建的是一个指向该对象的引用。例如,以下代码创建了一个`PassObj`对象,并通过`objA`引用该对象: ```java PassObj objA = new PassObj(); ``` 这里的`objA`...

    Java设计模式-原型模式详解

    * 需要复制一个对象的所有属性时,可以使用原型模式创建对象的克隆。 * 需要在运行时动态创建对象时,可以使用原型模式创建对象的克隆。 然而,原型模式也存在一些限制,例如: * 原型模式不适合用于复制包含资源...

Global site tag (gtag.js) - Google Analytics