我在从动态加载类中动态加载java类时遇到了问题。
我的类是一个ImageJ插件,它通过classloader动态地加载其他模块。在加载模块时,我有NoClassDefFoundError,该模块引用与ImageJ插件相同的包中的某些内容。
我要做的就是:
Class.forName在jar中加载所需的类(B)我无法加载B类,因为B指向A中没有在当前类加载器中找到的类导致了NoClassDefFoundError。
我认为我首先需要使用用于加载插件的类加载器ImageJ来加载我的模块,并且仍然可以找到以前由ImageJ加载的jars的引用。我想这样做,而不必重新编译ImageJ。
有什么方法可以解决这个问题,而不必插入ImageJ代码或修改它呢?
伪类示例
package a;
class A extends PlugInFrame {}
package a;
class C extends MyOwnPlugIn {}package b;
import a;
class B extends C {}发布于 2013-01-26 17:56:41
最简单的方法是通过使用类来避免动态但直接地加载类。
如果没有这种方法,最好的方法是确保.jar文件都在ImageJ的插件/文件夹中(或者如果您使用斐济,非插件.jar文件驻留在jars/中),并使用ImageJ的插件类加载器: IJ.getClassLoader().loadClass("blub");
注意,步骤3是一个大的不-不:您永远不应该向系统类装入器的类路径中添加元素。
还请注意,所有的ImageJ专家都可以通过imagej@list.nih.gov联系到,而不是通过在StackOverflow上发布。
发布于 2013-01-25 12:00:24
我不确定您是否需要动态加载这些类,但需要获得A的类加载器
ClassLoader classLoader = A.getClass().getClassLoader()然后使用它来安装B,记住B需要有一个no argument constructor。
为什么不构建包含B的插件jar文件呢?我已经创建了一堆插件,通常我会添加依赖项,然后构建插件jar文件,其中包含了它所需要的所有依赖项。
https://stackoverflow.com/questions/14520354
复制相似问题