Java基础15—— 类加载、双亲委派机制

116 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 简述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

重写findClassloadClassdefineClass方法

双亲委派机制

双亲委派机制

类加载器在收到加载类的任务时,首先将加载任务委托父类加载器,如果父类加载器可以完成类加载任务,就成功返回,父类再次将加载任务委托它的父类,只有父类加载器无法完成加载任务时,才自己加载。

加载类顺序:BootstrapClassLoader->ExtensionClassLoader->AppClassLoader->CustomClassLoader

检查类是否加载的顺序:

CustomClassLoader->AppClassLoader->ExtensionClassLoader->BootstrapClassLoader

双亲委派机制的优点

避免类的重复加载若相同的类被不同的类加载器加载就会产生不同的类

保证核心API不被修改

如何破坏双亲委派机制

重载loadClass()方法,即自定义类加载器。