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