- 创建对象有几种方式
(1)new创建对象;
(2)反射创建对象;
(3)采用clone机制;
(4)序列化机制。
- 创建反射对象的几种方式
(1)类.class:通过 类名.class 创建反射获取对象; 类.class 是静态加载,是JVM编译时就要加载。
Class<ClassDemo> oClass = ClassDemo.class;
(2) object.getClass() :以 实例对象.getClass() 的形式获取对象; getClass() 是一个对象实例的native方法。
Class bClass = this.getClass();
(3) Class.forName() :创建反射获取对象
Class aClass = Class.forName("com.basic.reflect.ClassDemo");
(4) this.getClass().getClassLoader().loadClass("类全路径") :通过类加载器获取对象
Class lClass = classLoader.loadClass("com.basic.reflect.ClassDemo"); ClassDemo c4 = (ClassDemo) lClass.newInstance();
上述几种写法都是获取一个实例对象或该类在内存中的实际类型。
上述几种写法都可以调用 newInstance() 实例化来获取实例对象。
如果在Spring容器中,可以从上下文容器中获取bean对象:
ApplicationContext.getBean(Class<T> var1);
- 浅克隆和深克隆
(1)浅克隆:只拷贝基本数据类型变量的值,引用数据类型变量是取地址值,不会拷贝引用类型变量指向的堆中的对象。
怎么实现浅克隆?
第一种方案:Object类提供了clone()方法,可以实现对对象的浅克隆。
protected native Object clone() throws CloneNotSupportedException;
第二种方案: BeanUtils#copyProperties ,实现是使用的反射完成的浅克隆。
org.springframework.beans.BeanUtils#copyProperties(java.lang.Object, java.lang.Object);
(2)深克隆:完全拷贝一个对象,不仅拷贝基本数据类型变量的值、引用数据类型变量的值也要层层拷贝。
怎么实现深克隆?
第一种方案:重写 clone() 方法,对于引用数据类型变量层层递归。
第二种方案:先将原对象序列化,再反序列化成克隆对象。
- 序列化和反序列化
序列化:把Java对象转为二进制流。
反序列化:把二进制流转为Java对象。
注意:
(1)对于可能存在序列化的JavaBean类,建议实现 Serializable ;不然可能有些序列化场景报错。
(2) 如果存在不想序列化的变量,请使用 transient 修饰。
有哪些序列化方式?
(1)Java对象序列化:使用InputStream流和OutputStream流进行转化。
(2)Json序列化:使用fastjson包来操作。
(3)Protocal Buffers(简称ProtoBuf)序列化:是谷歌的一项技术,ProtoBuf生成的是字节码,是一种轻便高效的结构化数据存储格式。