本文已参与「新人创作礼」活动,一起开启掘金创作之路。 简述JVM类加载过程
(1)加载
通过类全名获取类的二进制字节流并转化为方法区的运行时数据结构。
在堆中生成类的Class对象,作为方法区数据的入口。
(2)链接
验证:确保加载的文件格式,元数据,字节码,符号引用等类信息符合JVM规范,验证正确性。
准备:为方法区的类变量(静态变量) 分配内存并设置默认值。
解析:将符号引用转化为直接引用。
(3)初始化
执行类构造器的clinit方法,真正初始化类。clinit方法是编译器收集类中的所有静态变量的赋值动作和静态语句块中的语句合并产生的。
简述JVM中的类加载器
BootstrapClassLoader启动类加载器,由C++编写,加载java核心库,即/lib下的jar包和类。。
ExtensionClassLoader扩展类加载器,java编写,加载Java的扩展库,即 /lib/ext目录下的jar包和类。
AppClassLoader应用类加载器,java编写,加载当前classPath下的jar包和类。
java. lang.ClassLoader类
除了启动类类加载器,其他类加载器都要继承ClassLoader类。
可以根据一个类的名称,找到或者生成其对应的字节代码,再生成一个对应的Class对象。
如何构建自定义类加载器
继承自java.lang.ClassLoader
重写findClass、loadClass、defineClass方法
双亲委派机制
双亲委派机制
类加载器在收到加载类的任务时,首先将加载任务委托给父类加载器,如果父类加载器可以完成类加载任务,就成功返回,父类再次将加载任务委托它的父类,只有父类加载器无法完成加载任务时,才自己加载。
加载类顺序:BootstrapClassLoader->ExtensionClassLoader->AppClassLoader->CustomClassLoader
检查类是否加载的顺序:
CustomClassLoader->AppClassLoader->ExtensionClassLoader->BootstrapClassLoader
双亲委派机制的优点
避免类的重复加载,若相同的类被不同的类加载器加载就会产生不同的类。
保证核心API不被修改。
如何破坏双亲委派机制
重载loadClass()方法,即自定义类加载器。