创建对象的方法:new、反射、clone、反序列化
1 new
package xx.study.design.createObj;
public class NewCreateObj {
public static void main(String[] args) {
Programmer programmer=new Programmer("程序员",29);
System.out.println(programmer);
}
}
2 反射
package xx.study.design.createObj;
import java.lang.reflect.Constructor;
/**
* Class.newInstance();只能反射无参的构造器,需要构造器可见;
* Constructor.newInstance();可以反射任何构造器,可以反射私有构造器
*/
public class ReflectCreatObj {
public static void main(String[] args) throws Exception {
Class clazz = Programmer.class;
//利用Class.newInstance()
Object object1 = clazz.newInstance();
System.out.println(object1);
//利用Constructor.newInstance()反射无参构造方法
Constructor cons1 = clazz.getDeclaredConstructor();
Object object2 = cons1.newInstance();
System.out.println(object2);
//利用Constructor.newInstance()反射私有构造方法
Constructor cons2 = clazz.getDeclaredConstructor(String.class,Integer.TYPE);
if(!cons2.isAccessible())
cons2.setAccessible(true);
Object object3 = cons2.newInstance("张三",12);
System.out.println(object3.toString());
}
}
3 clone
package xx.study.design.createObj;
/**
* Programmer必须实现Cloneable接口 clone()
*/
public class CloneCreateObj {
public static void main(String[] args) {
Programmer programmer=new Programmer("码农",22);
Programmer programmerTwins= (Programmer) programmer.Clone();
System.out.println(programmerTwins);
}
}
4 发序列化
package xx.study.design.createObj;
import java.io.*;
/**
* 使用 反序列化ObjectInputStream的readObject()方法:类必须实现 Serializable接口
*/
public class SerializableCreateObj {
public static void main(String[] args) {
Programmer programmer=new Programmer("cx",22);
// 序列化
ObjectOutputStream objectOutputStream = null;
try {
//序列化写入文件
objectOutputStream = new ObjectOutputStream(new FileOutputStream("test.txt"));
objectOutputStream.writeObject(programmer);
// 反序列化
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("test.txt"));
Programmer programmer1 = (Programmer) objectInputStream.readObject();
System.out.println(programmer1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
基类
package xx.study.design.createObj;
import java.io.Serializable;
public class Programmer implements Serializable,Cloneable {
private String name;
private int age;
public Programmer(String name, int age) {
this.name = name;
this.age = age;
}
public Programmer(){}
@Override
public String toString() {
return "Programmer{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Object Clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
}