虚拟机类加载机制
加载:
1)通过一个类的全限定名来获取定义此类的二进制字节流。
2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
3)在内存中生成一个代表这个类的java.lang.Class对象,作为方法区对这个类的各种数据的访问入口
验证:
1)文件格式验证
2)元数据验证:
这个类的父类是否有父类;是否继承了不允许被继承的类(final修饰的类);这个类如果不是抽象类,是否实现了其父类或接口之中要求实现的所有方法;类中的字段。方法是否与父类产生矛盾等等
3)字节码验证(复杂)
通过数据流(高复杂性)和控制流分析,确定程序语义是否合法的,符合逻辑的。
准备:
正式为类变量分配内存并设置类变量初始值的阶段,这些变量使用的内存都将在方法区中进行分配。包括类变量(static修饰的变量)不包括实例变量
初始值:
解析:
虚拟机将常量池的符号引用替换为直接应用的过程
1.类或接口的解析:
2.字段解析:
3.类方法解析:
4.接口解析方法
初始化:
类初始化的最后一个阶段,这时才开始执行类中定义的java程序代码(字节码);
非法向前应用:
public class Test { static { i = 0; System.out.println(i); //非法向前应用 } static int i = 1; }
方法执行的顺序:
字段解析:
使用和卸载就不说了,大家应该都都知道的
类与类加载器
不同得类加载器对instanceof关键字运算得结果影响。