java - 什么是类加载器反转

标签 java classloader

任何人都可以解释“核心 Java 第 II 卷第 8 版”第 759 页中的以下段落:

Your application code contains a helper method that calls Class.forName(classNameString).

That method is called from a plugin class.

The classNameString specifies a class that is contained in the plugin JAR.

The author of the plugin has the reasonable expectation that the class should be loaded. However, the helper method's class was loaded by the system class loader, and that is the class loader used by Class.forName. The classes in the plugin JAR are not visible. This phenomenon is called classloader inversion ...

根据我的理解,如果“辅助方法的类是由系统类加载器加载的”,那么它所在的插件jar必须放在CLASSPATH中,而且如果“classNameString指定了一个类包含在plugin JAR”那么这两个类应该都在同一个jar文件中,在CLASSPATH中,那么为什么“插件JAR中的类不可见”

最佳答案

说类Helper.class在core.jar中,它在CLASSPATH上,由系统类加载器加载。

PluginMain.class 和PluginWidget.class 在plugin.jar 中,但是plugin.jar 不在CLASSPATH 中。

作为插件系统的一部分,插件创建一个名为 PluginClassLoader 的新类加载器,使用它从 plugin.jar 加载 PluginMain.class,并调用 PluginMain.start()。

如果 PluginMain.start() 调用 Helper.deluxeLoadClass("PluginWidget.class"),并且 deluxeLoadClass() 最终调用 Class.forName("PluginWidget.class"),则会发生类加载器反转。这失败了,因为 Helper.class 是由系统类加载器加载的,它看不到 PluginWidget.class,因为系统类加载器在其类路径上没有 plugin.jar。

这个例子有点做作,但这些事情在使用 complex class loader hierarchies 的 J2EE 容器中更频繁地发生。 .

关于java - 什么是类加载器反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975604/

相关文章:

java - 使用自定义类加载器加载资源包

java - Eclipse:具有相同名称但位置不同的多个项目

java - SOAP 错误 : Axis 2 AbstractMethodError

Java jar getResource 在 linux 中不工作

java - 执行 ANT 任务时的默认类加载器

java - ModuleLayer 和 ClassLoader 有什么关系?

java - 调整图像大小 java getScaledInstance

JAVA窗口设计为空白

java - "May 28, 2013 6:04:38 PM"是什么格式?

java - JBoss 7 类加载奇迹