【问题标题】:dynamically loading classes from a ImageJ plugin从 ImageJ 插件动态加载类
【发布时间】:2013-01-25 10:56:15
【问题描述】:

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

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

我真正做的是:

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

我无法加载 B 类,因为我得到了一个 NoClassDefFoundError,这是由于 B 指向 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 {}

【问题讨论】:

    标签: java class dynamic imagej reloading


    【解决方案1】:

    最简单的方法是避免动态加载类,而是直接使用它。

    如果没有该方法,最好的方法是确保 .jar 文件都在 ImageJ 的 plugins/ 文件夹中(或者如果您使用 Fiji,非插件 .jar 文件位于 jars/ 中)并使用 ImageJ 的插件类加载器: IJ.getClassLoader().loadClass("blub");

    请注意,您的第 3 步是一个大禁忌:您永远不应该将元素添加到系统类加载器的类路径中。

    另请注意,所有 ImageJ 专家都可以通过 imagej@list.nih.gov 联系到,而不是通过在 StackOverflow 上发帖。

    【讨论】:

      【解决方案2】:

      我不确定是否需要动态加载这些类,而是要获取 A 的类加载器

      ClassLoader classLoader = A.getClass().getClassLoader()
      

      然后使用它来实例化 B,记住 B 需要有一个no argument constructor

      你为什么不构建你构建包含B的插件jar文件?我创建了一堆插件,通常我添加依赖项,然后构建包含它需要的所有依赖项的插件 jar 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-26
        • 2014-12-29
        • 1970-01-01
        • 1970-01-01
        • 2011-07-22
        • 2013-08-15
        • 2011-08-22
        • 2017-08-03
        相关资源
        最近更新 更多