目录
1. 创建对象的方式
创建对象的方式有多种,例如使用new关键字、Class的newInstance()方法、Constructor类的newInstance()方法、clone()方法、反序列化、第三方库Objenesis等,如图所示。
1.1 创建对象方式具体描述
①使用new关键字——调用无参或有参构造器创建。
②使用Class的newInstance()方法——调用无参构造器创建,且需要是public的构造器。
③使用Constructor类的newInstance()方法——调用无参或有参、不同权限修饰构造器创建,实用性更广。
④使用clone()方法——不调用任何参构造器,且对象需要实现Cloneable接口并实现其定义的clone()方法,且默认为浅复制。
⑤使用反序列化——从指定的文件或网络中,获取二进制流,反序列化为内存中的对象。
第三方库Objenesis——利用了asm字节码技术,动态生成Constructor对象。
2. 创建对象的步骤
2.1 判断对象对应的类是否加载、链接及初始化
虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化(即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以“ClassLoader+包名+类名”为Key查找对应的“.class”文件。如果没有找到文件,则抛出ClassNotFoundException异常。如果找到,则进行类加载,并生成对应的Class类对象。如下图所示,
2.2 为对象分配内存
首先计算对象占用空间大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅