1.什么是java类的加载
java 类的加载是由虚拟机来完成的。简单来说就是java虚拟机可以多各种途径(比如硬盘,网络)等将class文件加载到内存的一个过程。其中这个加载过程可以划分成几个阶段:加载,连接,初始化,使用,卸载;每个过程都有自己必须完成的职责。从java api 上来讲就是将class文件 转换成相对应的Class对象
2.java类的加载与使用过程图:
3.加载过程
3.1查找并加载类的二进制数据流
3.2进制字节流所代表的静态存储结构转化成方法区的运行时数据结构
3.3创建代表此字节码的Class对象
4.连接过程
连接过程又可以分成在个子阶段:
A:验证 :验证 类的字节码是否符合jvm的要求,大致完成以下四个校验动作:
文件格式验证
源数据验证
字节码验证
符号引用验证
B:准备:为类的静态变量分配内存,并将其初始化为默认值
C:解析:把类中的符号引用转换成直接引用
5.初始化过程
类加载最后阶段,若该类具有超类,则对其进行初始化,执行静态初始化器和静态初始化成员变量(如前面只初始化了默认值的static变量将会在这个阶段赋值,成员变量也将被初始化)
6.使用过程
使用类中定义的行为
7.卸载过程
从内存中释放
package com.test; class Test1{ public static int a; public static String str; static{ System.out.println("static execute....a="+a+",str="+str); str=getString(); } public Test1(){ System.out.println("New Test1 Instance."); } public static String getString(){ System.out.println("static method exectued..."); return "aaa"; } } public class ClassLoaderTest1 { public static void main(String[] args) throws Exception{ Class cls=Class.forName("com.test.Test1"); System.out.println("在使用之前准备就绪"); Test1 t1=(Test1)cls.newInstance(); } }
输出:
static execute....a=0,str=null static method exectued... 在使用之前准备就绪 New Test1 Instance.