【02】面试官:说一下双亲委派机制和如何打破双亲委派机制

类加载器

双亲委派机制是类加载器的一种工作方式,用于控制类的加载过程。类加载器是实现双亲委派机制的具体实体。

类加载器的主要任务是将类的字节码加载到内存中,并创建对应的类对象。当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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值