类加载器
双亲委派机制是类加载器的一种工作方式,用于控制类的加载过程。类加载器是实现双亲委派机制的具体实体。
类加载器的主要任务是将类的字节码加载到内存中,并创建对应的类对象。当Java程序需要使用某个类时,类加载器会在类路径中搜索并加载类的字节码文件。
「类加载器分为:」
-
引导类加载器:是由c++创建,在jvm创建之后加载,它负责加载JRE下lib目录的jar。
-
扩展类加载器:负责加载JER下lib的ext,ExtClassLoader,它的父加载器是引导类加载器。
-
应用程序加载器:负责加载应用程序,AppClassLoader,它的父加载器是扩展类加载器。
-
自定义加载器:自己定义的,它的父加载器是应用程序加载器。
System.out.println("String加载类:" + String.class.getClassLoader());
System.out.println("DESKeyFactory加载类:" + com.sun.crypto.provider.DESCipher.class.getClassLoader());
System.out.println("Demo加载类:" + Demo.class.getClassLoader());
输出:
String加载类:null
DESKeyFactory加载类:sun.misc.Launcher$ExtClassLoader@372f7a8d
Demo加载类:sun.misc.Launcher$AppClassLoader@18b4aac2
解释:
String的加载类是引导类加载器加载的,引导类是由c++生成的,所以看不到,是个null。
ExtClassLoader是扩展类加载器。
AppClassLoader是应用程序加载器,一般加载类默认用到AppClassLoader。
「Launcher类」
Launcher
类是Java虚拟机(JVM)启动的入口类之一。它是JVM的一部分,并负责启动Java应用程序。C++引导类加载完之后会先实例化Launcher。在实例化Launcher类的时候会创建ExtClassLoader加载器和AppClassLoader加载器。
class Launcher{
private ClassLoader loader;
private static Launcher launcher = new Launcher();
public static Launcher getLauncher() {
//默认AppClassLoader
return launcher;
}
public Launcher() {
//实例化扩展类加载器,它的父类没有设置值
Launcher.ExtClassLoader var1 = Launcher.ExtClassLoader.getExtClassLoader();
//初始化AppClassLoader,并且将ext传入设置为父类加载器
this.loader = Launcher.AppClassLoader.getAppClassLoader(var1);
}
... ...
}
我们也可以手动去调用加载某个类
Launcher.getLauncher().getClassLoader().loadClass("Demo.class")
双亲委派机制
双亲委派的逻辑代码实现在Launcher类中loadClass方法中。源码如下
Class<?> loadClass(String