1

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

我的类是一个ImageJ插件,它通过classloader. 我在加载引用与插件NoClassDefFoundError在同一个包中的东西的模块时。ImageJ

我具体做的是:

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

我无法加载 B 类,因为我得到了NoClassDefFoundError由 B 指向 A 中的类而在当前类加载器中找不到的结果。

我认为我需要首先使用ImageJ用于加载插件的相同类加载器才能加载我的模块并仍然找到对以前加载的 jar 的引用ImageJ。我想这样做而不必重新编译ImageJ

有什么方法可以解决这个问题而不必ImageJ修改代码或修改它?

伪类示例

package a;
class A extends PlugInFrame {}


package a;
class C extends MyOwnPlugIn {}

package b;
import a;
class B extends C {}
4

2 回答 2

2

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

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

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

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

于 2013-01-26T17:56:41.427 回答
1

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

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

然后使用它来实例化 B 记住 B 需要有一个无参数构造函数

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

于 2013-01-25T12:00:24.130 回答