java 创建一个对象 Cloneable

               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;
 }
 
 
}

猜你喜欢

转载自zw7534313.iteye.com/blog/2217952