类加载生命周期
a. 装载(load)i. 开始时机:1) new实例化对象时,若类没有加载2) 读取或设置一个类static字段,若类没有被加载。final除外,因为final字段的值已经在编译期放到了常量池中3) 调用类的static方法4) 反射调用类5) 初始化一个类时,若父类没有被加载,会先加载父类ii. 不会加载类的情况1) 通过子类去引用父类的static字段,不会导致子类加载2) 数组定义引用类,不会导致类加载。 如 Student[] stu = new Student[10], student类不会被加载3) 读取类的final字段,不会导致类加载。iii. 流程1) 通过类的全限定名获取定义此类的二进制流。可以从class文件,网络,或者运行时计算(如动态代理)出这个二进制流2) 将字节流代表的static存储结构转化为方法区的运行时数据结构,也就是存储到方法区中3) 内存中生成一个代表此类的class对象b. 链接i. 验证1) 目的:防止加载的class文件危害虚拟机本身安全2) 流程:a) 文件格式验证,如magic是否为0xCAFEBABE,主次版本号是否在当前VM能处理范围内b) 元数据验证,主要验证描述信息是否符合Java语言规范c) 字节码验证,最复杂,通过数据流和控制流分析,确定程序语义是合法的,符合逻辑的d) 符号引用验证,如通过全限定名能否找到类