打破Java中类加载器可见性原则的代码解析
在Java中,类加载器遵守可见性原则,即一个类加载器只能加载其父类加载器或自身加载过的类和资源。然而,在某些情况下,这一原则会被打破。
如示例代码所示,当tomcat加载spring-web模块时,它使用ServiceLoader加载所有实现了ServletContainerInitializer接口的类。这会违背可见性原则,因为这些类可能是由其他类加载器加载的。
该代码使用Thread.currentThread().getContextClassLoader()方法获取当前线程的上下文类加载器,该加载器实际上是sun.misc.Launcher.AppClassLoader。这个类加载器不是BootstrapClassLoader或其直接子加载器,它负责加载位于classPath下的类。
相反,正常的双亲委派过程如下所示:
因此,通过设置线程上下文类加载器,ServiceLoader可以打破可见性原则,允许加载由其他类加载器加载的类。
在IntelliJ IDEA中使用快捷键修改POM文件依赖版本时生成新的repository标签而不是直接修改版本号的原因可能与IDE的自动补全和依赖管理机制有关。以下是一些可能的原因和解决方法:依赖管理机制:IntelliJ IDEA可能会尝试从不同的存储库中查找指定版本的依赖。如果指定的版本在当前配置的存储库中找不到,IDE可能会自动添加新的存储库以确保可以下载到所需的版本。快捷键功能限制:某些快捷键可能只负责版本号的快速修改,而不处理存储库的管理。当你使用快捷键时,IDE可能会默认添加新的存储库以确
Java框架的优点和发展趋势是什么?
Java框架和F#框架在金融领域的优势
Java函数式编程对数据处理的革命性影响
JNA调用C++ DLL时如何避免异常导致JVM崩溃?
Android RecyclerView数据更新后视图不刷新,如何解决?