任何人都可以解释“核心 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/