个人主页:五敷有你
系列专栏:JVM
⛺️稳中求进,晒太阳
双亲委派机制
在Java中如何使用代码的方式去主动加载一个类呢?
- 方式1:使用Class.forName方法,使用当前类的类加载器去加载指定的类。
- 方式2:获取到类加载器,通过类加载器的loadClass方法指定某个类加载器加载
在Idea中测试下面的案例:
双亲委派机制:
当一个类加载器接受到加载类的任务时,会自底向上查找是否加载过,在由顶向下进行加载
问题
如果一个类重复出现三各类加载器的加载位置,应该由谁来加载呢?
启动类加载器,根据双亲委派机制,它的优先级是最高的。
String类能否被覆盖?
不能,会返回启动类加载器在rt.jar包中的String类
- 应用程序类加载器parent父类加载器是扩展类加载器,而扩展类加载器的parent是空,但是在代码逻辑上,扩展类加加载器依然会把启动类加载器当成父类加载器处理
- 启动类加载器使用C++编写,没有父类加载器
使用arthas来看类加载器 classloader -t
面试
类的双亲委派机制是什么
- 当一个类去加载某个类的时候,会自底向上查找是否加载过,如果加载过就直接返回,如果一直到最顶层的类加载器都没有加载过,再由顶向下进行加载。
- 应用程序类加载器的父类加载器是拓展类加载器,扩展类加载器的父类是启动类加载器。
- 双亲委派机制的好处有两点:
- 第一:避免恶意代码替换JDK中的核心类库,比如:java.lang.String,确保核心类库的完整性和安全性。
- 第二:避免一个类被重复加载