标签:数据类型 invoke 变量 操作 method 方法 安全 类型 直接
必须立即进行类初始化的时机有且仅有五个:
1、new、getstatic、putstatic、invokestat四个字节码命令时,其实就是new一个对象,读取或者设置类静态变量,调用类的静态方法时
2、使用java.lang.reflect包的方法对类进行反射调用时
3、初始化一个类时他的父类没有初始化时先初始化父类
4、虚拟机启动时需要先执行main方法,包含main方法的类这时候初始化
5、使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例的最后解析结果REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄,并且这个方法句柄所对应的类没有进行初始化,则要先触发器初始化(这个意思是反射调用类的静态变量和静态方法的时候如果类没有初始化就先初始化该类?应该是这个意思)
总结来说:new、父类、main方法类(自己简称主类)、反射调用类、反射调用静态变量或方法
类加载分为加载、验证、准备、解析、初始化、使用、卸载。
1、加载:a、获取此类的二进制字节流 b、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 c、在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
2、验证:验证是连接阶段你的第一步,这一阶段的目的是为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。
a、文件格式验证:验证字节流是否符合Class文件格式的规范
b、元数据验证:语义分析是否其描述的信息符合java语言规范,也就是对元数据信息中的数据类型进行校验
c、字节码验证:通过数据流和控制流分析,确定程序语义是合法、符合逻辑的。
d、符号引用验证:符号引用校验,该校验发生在虚拟机将符号引用转化为直接引用的时候。确保解析动作正常进行。
3、准备:准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,准备阶段后变量为初始值,比如int是0,实际值在初始化进行。当然如果是final修饰的常量会直接赋予常量值。
4、解析:解析阶段是虚拟机讲常量池内的符号引用替换为直接引用的过程
a、类或接口解析
b、字段解析
c、接口方法解析
5、初始化:执行静态代码和类变量赋值操作,<clinit>是线程安全的。只会被一个线程执行
标签:数据类型 invoke 变量 操作 method 方法 安全 类型 直接
原文地址:https://www.cnblogs.com/blogs423524123/p/10099162.html