加载:1. 通过完全限定名加载.class
字节码文件,获取字节流。2. 实例化对应的Class
实例
验证:验证字节流是否符合虚拟机规范,文件格式等
准备:为类变量分配内存并设置初始值。存储在方法区中
解析:将符号引用转为直接引用
初始化:执行JAVA代码进行初始化。执行先初始化父类,再初始化子类。先初始化静态,再初始化非静态的。先执行初始化块,再执行构造方法。
- 类加载需要锁。是因为避免多个线程同时访问资源,导致结果不正确
- JAVA如何判断一个类相等?完全限定名相同且都是同一个类加载器加载得到的
Class
实例。
- 因此,类加载需要
双亲委派模型
。子加载器需要先让父加载器加载,如果没有再执行自身的加载。这样能保证一个类产生一个Class
对象,避免混乱
从JDK1.8之后的版本PlatformClassLoader
取代了原来的ExtClassLoader
。主要是因为之前直接在lib\ext
目录添加jar包不够安全。
public class Main {
public static void main(String[] args) throws Exception {
ClassLoader loader = Main.class.getClassLoader();
while (loader != null) {
System.out.println(loader);
loader = loader.getParent();
}
}
}
输出:
jdk.internal.loader.ClassLoaders$AppClassLoader@4459eb14
jdk.internal.loader.ClassLoaders$PlatformClassLoader@47d384ee
进阶Java编程(11)ClassLoader类加载器【待完成】
来源:oschina
链接:https://my.oschina.net/u/3870422/blog/3209483