双亲委派机制的优点:
一、概述:
二、四种类加载器介绍:
2.1.启动类加载器(Bootstrap ClassLoader):
2.2.扩展类加载器 Extension ClassLoader:
2.3.应用程序类加载器 ApplicationClassLoader:
2.4.自定义类加载器:
public class CustomClassLoader extends ClassLoader {
//省略类自定义加载器的其他具体实现代码。
public static void main(String[] args) {
try {
// 创建自定义的类加载器1
CustomClassLoader loader1 = new CustomClassLoader();
Class<?> clazz1 = loader1.findClass("com.test.java.User");
// 创建自定义的类加载器2
CustomClassLoader loader2 = new CustomClassLoader();
Class<?> clazz2 = loader2.findClass("com.test.java.User");
// clazz1和clazz2对应了不同的类模版结构
System.out.println(clazz1 == clazz2);
// false
System.out.println(clazz1.getClassLoader());
// com.test.java.CustomClassLoader@4aa298b7
System.out.println(clazz2.getClassLoader());
// com.test.java.CustomClassLoader@28d93b30
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}
}
2.4.1.父子关系:
2.
2.4.2.加载路径:
三种类加载器依据双亲委派机制加载类的具体过程如下:
1.查询day1114.Cat类是否加载过
2.加载day1114.Cat类:
优点: 同样的类不会被重复加载(避免类的重复加载,确保一个类的全局唯一性,保护程序安全,防止核心 API 被随意篡改)。
四、案例测试:
public static void main(String[] args) { // 应用程序类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader); // sun.misc.Launcher$AppClassLoader@18b4aac2 // 扩展类加载器 ClassLoader extClassLoader = systemClassLoader.getParent(); System.out.println(extClassLoader); // sun.misc.Launcher$ExtClassLoader@232204a1 // 引导类加载器 ClassLoader bootstrapClassLoader = extClassLoader.getParent(); System.out.println(bootstrapClassLoader); // null (因为是C++编写的所以为null) }
4.1.引导类加载器:
public static void main(String[] args) { //获取引导类加载器加载的类库 URL[] urLs = Launcher.getBootstrapClassPath().getURLs(); for (URL urL : urLs) { System.out.println(urL); } // 从上边的路径中随意选择一个类,查看其类加载器 ClassLoader classLoader1 = Object.class.getClassLoader(); System.out.println(classLoader1); // null } //运行结果: 有两种,一个是jdk1.8.0_77/jre/lib下的jar, 一种是null //null并不是说明没有引导类加载器,而是因为引导类加载器是用C/C++语言实现的 //file:/C:/Program Files/Java/jdk1.8.0_77/jre/lib/ 下的很多jar文件 //null
4.2.扩展类加载器:
public static void main(String[] args) { // 扩展类加载器加载的类库 String extDirs = System.getProperty("java.ext.dirs"); for (String extPath : extDirs.split(";")) { System.out.println(extPath); } //C:\Program Files\Java\jdk1.8.0_77\jre\lib\ext //C:\Windows\Sun\Java\lib\ext // 从上边的路径中随意选择一个类,查看其类加载器 ClassLoader classLoader2 = CurveDB.class.getClassLoader(); System.out.println(classLoader2); //sun.misc.Launcher$ExtClassLoader@4b67cf4d }

4.3.应用程序类加载器:
public static void main(String[] args) { // 获取应用程序类加载器 ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader(); System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2 // 对于自定义的类,查看其类加载器 ClassLoader classLoader3 = Cat.class.getClassLoader(); System.out.println(classLoader3); //sun.misc.Launcher$AppClassLoader@18b4aac2 }
author : zhaoyq 2024-11-14
编辑
编辑


浙公网安备 33010602011771号