登录
首页 >  文章 >  java教程

Java类加载器可见性原则如何被打破?

时间:2024-12-17 11:28:03 245浏览 收藏

小伙伴们对文章编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《Java类加载器可见性原则如何被打破?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

Java类加载器可见性原则如何被打破?

打破Java中类加载器可见性原则的代码解析

在Java中,类加载器遵守可见性原则,即一个类加载器只能加载其父类加载器或自身加载过的类和资源。然而,在某些情况下,这一原则会被打破。

如示例代码所示,当tomcat加载spring-web模块时,它使用ServiceLoader加载所有实现了ServletContainerInitializer接口的类。这会违背可见性原则,因为这些类可能是由其他类加载器加载的。

该代码使用Thread.currentThread().getContextClassLoader()方法获取当前线程的上下文类加载器,该加载器实际上是sun.misc.Launcher.AppClassLoader。这个类加载器不是BootstrapClassLoader或其直接子加载器,它负责加载位于classPath下的类。

相反,正常的双亲委派过程如下所示:

  1. 由BootstrapClassLoader加载rt.jar中的接口类。
  2. AppClassLoader寻找接口的实现类,但无法在classPath中找到。
  3. AppClassLoader无法进一步委托给父加载器,因为它就是最顶层的加载器。
  4. 因此,AppClassLoader必须指定一个线程上下文类加载器(sun.misc.Launcher.AppClassLoader),该加载器可以加载外部jar包中的实现类。

因此,通过设置线程上下文类加载器,ServiceLoader可以打破可见性原则,允许加载由其他类加载器加载的类。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>