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

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

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

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

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

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

立即学习“Java免费学习笔记(深入)”;

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

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

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

以上就是Java类加载器可见性原则如何被打破?的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2599192.html

(0)
上一篇 2025年3月6日 18:46:04
下一篇 2025年3月6日 00:53:47

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论