Java类加载器机制-双亲委派模型详细的答疑

本文详细介绍了Java类加载器的工作原理,包括为何需要多个类加载器,类加载器如何实现Class对象的隔离,以及为何有时需要打破双亲委派模型。此外,还探讨了Class.forName与ClassLoader.loadClass方法的区别,以及如何利用上下文加载器打破模型以满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概要

这两天看了大量关于java类加载器的文章,有很多疑问一只困扰着我,今天折腾了半天,又通过自己写了一个自定义加载器,总算基本搞清楚了。在这里总结一下,若有错误的地方,还希望各位指正。

为什么java需要多个类加载器?

  • 保证同一个类不同版本同时存在。例如tomcat中两个应用用到了同一个class,但是版本不同,此时使用不同的加载器就可以保证两个不同版本的类同时存在了;
  • 可以对类进行增强。例如aop中,我们通过cglib对类A进行增强,但又不能影响其他类对A的使用。这时候我们可以使用另一个加载器来加载增强后的类A;
  • 保证安全。类中的方法和属性要具有包访问权限的前提是,必须是由同一个类加载器加载的,比如lang包下的类都由bootstrap加载,但bootstrap不会加载rt.jar以外的class文件,就避免了其他文件对lang包下包访问权限的属性的更改了。
    • jdk中默认的三种加载器代表了三种不同的信任级别。最可信的级别是java核心API类。然后是安装的拓展类,最后才是在类路径中的类;

加载器如何实现Class对象的隔离?

  • 首先有一点要说明:所谓的不同加载器是指不同的加载器实例对象,不是指不同的加载器类。例如:AppClassLoader加载器有两个实例对象loader1和loader2,那么这两个实例对象加载的Class文件也是互相隔离;
  • 可以这样理解:每个加载器的实例在方法区中都有自己的一个唯一的命名空间,它加载的所有class文件的Class对象都存放在该命名空间中。通过该命名空间就实现了不同加载器实例对同一个calss文件加载所生成的Class对象的隔离。
  • 为什么父类加载器加载的类无法访问子类加载器加载的类
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值