总结:
java 创建对象的方式有四种:
-
通过 new 的方式创建 。
-
通过反射获取类的构造方法,生成对象
-
克隆,通过已经生成的对象,克隆出一个新的对象,但是类必须要实现Cloneable,并且重写 clone()方法。
-
序列化: 通过序列化已经生成的bean,在将其反序列化生成新的bean。
其中克隆,序列化需要依赖于已经生成的对象。
示例如下:
Bean.java :
import java.io.Serializable;
public class Bean implements Serializable,Cloneable{
private static final long serialVersionUID = 1L;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试类:
public class Test {
public static void main(String[] args) throws Exception{
// 通过 new 获取
Bean bean = new Bean();
System.out.println("bean:" + bean.hashCode());
// 通过反射创建
Constructor<Bean> constructor = Bean.class.getDeclaredConstructor();
constructor.setAccessible(true);
Bean reflex = constructor.newInstance();
System.out.println("reflex:"+reflex.hashCode());
// 通过克隆创建
Bean cBean = (Bean) bean.clone();
System.out.println("clone:"+cBean.hashCode());
//通过序列化,反序列化获取
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(bean);
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
Bean serialize = (Bean) ois.readObject();
if (ois != null) ois.close();
if (bis != null) bis.close();
if (oos != null) oos.close();
if (bos != null) bos.close();
System.out.println("serialize:"+serialize.hashCode());
}
}
打印结果: