从ImageJ插件动态加载类

时间:2013-01-25 10:56:15

标签: java class dynamic imagej reloading

我在从动态加载的类动态加载java类时遇到问题。

我的类是ImageJ插件,它通过classloader动态加载其他模块。在加载引用与NoClassDefFoundError插件位于同一包中的内容的模块时,我有ImageJ

我到底做的是:

  1. ImageJ加载插件(A)
  2. (A)获取系统类加载器
  3. (A)将jar url添加到类加载器
  4. (A)尝试使用Class.forName
  5. 在jar中加载所需的类(B)

    我无法加载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 {}
    

2 个答案:

答案 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文件。