java 的类加载机制分三步,加载 ---连接 ---初始化
加载: 将.class文件中的二进制数据读入到内存中,把它存放在运行时数据区的反方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
jvm加载类二进制数据有这几种途径:
a: 把一个java源文件动态编译成class文件。
b: 从一个本地文件系统中加载class文件。
c: 通过网络下载类的.class文件。比如:applat.
d: 从Zip,jar或其它类型的归档文件中提取.class文件。
e: 从一个专有的数据库中提取.class文件。
连接:包括三个过程: 验证,准备,和解析。其中验证主要是检查与语法上的错误。准备将静态变量赋上其类型默认值。
解析:将符号引用转变为直接引用。
初始化:将静态变量赋上初始值,执行静态代码快,其顺序是从上到下的顺序执行。
类加载器在加载不了类的时候,并不一定报错,而是类在第一次主动使用的时候,才会去报加载错误信息。
类首次主动使用,大概有这些情况:
1:调用了类的静态方法或变量。
2:用反射的方式创建对象。