我在从动态加载的类动态加载java类时遇到问题。
我的类是ImageJ
插件,它通过classloader
动态加载其他模块。在加载引用与NoClassDefFoundError
插件位于同一包中的内容的模块时,我有ImageJ
。
我到底做的是:
Class.forName
我无法加载B类,因为我得到一个由{B}引起的NoClassDefFoundError
指向A中当前类加载器中找不到的类。
我认为我需要在第一个地方使用相同的类加载器ImageJ
来加载我的模块,并且仍然可以找到之前由ImageJ
加载的jar的引用。我想这样做而不必重新编译ImageJ
。
有没有办法解决这个问题,而不必使用ImageJ
代码或不得不修改它?
伪类示例
package a;
class A extends PlugInFrame {}
package a;
class C extends MyOwnPlugIn {}
package b;
import a;
class B extends C {}
答案 0 :(得分:2)
最简单的方法是不要动态加载类,而是直接使用它。
如果没有这种方法,最好的方法是确保.jar文件都在ImageJ的插件/文件夹中(或者如果你使用Fiji,非插件.jar文件存放在jar /中)并使用ImageJ的插件类加载器: IJ.getClassLoader()的loadClass( “泡壳”);
请注意,您的第3步是一个很大的禁忌:您永远不应该将元素添加到系统类加载器的类路径中。
另请注意,所有ImageJ专家都可以通过imagej@list.nih.gov联系,而不是通过在StackOverflow上发布。
答案 1 :(得分:1)
我不确定你是否需要动态加载这些类,但要获得A的类加载器
ClassLoader classLoader = A.getClass().getClassLoader()
然后使用它来实现B轴承,记住B需要no argument constructor。
为什么不构建你构建包含B的插件jar文件?我创建了一堆插件,通常我添加依赖项,然后构建包含所需依赖项的插件jar文件。