0

我确信这对大多数 java 程序员来说似乎很明显——我“认为”我知道答案,但我的问题是我需要使用自定义类加载器。我想使用自定义类加载器,并且仍然能够像使用任何包含的类一样在我的代码中使用这些类。

例子:

// returns my class loader -- set earlier on the thread.
ClassLoader cl = Thread.currentThread().getContextClassLoader();
Class loadedVersion = Class.forName("org.example.MyClass"); // works
// loadedVersion's class loader is also equal to cl

// generates "java.lang.NoClassDefFoundError" at runtime on the following line
org.example.MyClass m = new org.example.MyClass();

我将如何着手这样做,以便我可以使用自定义类加载器加载类,并且仍然能够在编辑器中“简单地”使用我的类?

编辑:修改后的标题具有误导性——类加载得很好。如我原来的帖子所示。我的理解是,问题是我目前无法在常规声明语句中使用这些类(在编辑器中,就像我使用任何 java.* 类一样)。

更新,我希望这能更好地解释我正在尝试做的事情。

// set the thread's class loader
ClassLoader cloader = new MyClassLoader(); // internal mess to load bytecode omitted
Thread.currentThread().setContextClassLoader(cloader);

// This works:
Method m = cloader.loadClass("my.SuperClass").getMethod("doStaticMagic", new Class<?>[] {});
m.invoke(null, null);

// This does not work:
my.SuperClass.doStaticMagic(); // NoClassDefFoundError

这就是“问题”。我想在编辑器中“简单地”使用我的课程(我真的不知道正确的词)。我不想加载每个单独的方法——这不是类加载器的用途吗?

4

3 回答 3

0

如果您在类路径上只有接口并通过类加载器或其他方式加载实现会更好,如下面的代码所示:

Class loadedVersion = Class.forName("org.example.MyClass"); 

IMyClass m = (IMyClass)loadedVersion.newInstance();

其中 IMyClass 是由org.example.MyClass. 通过这种方式,您可以将类的实现与客户端代码完全分离

编辑

NoClassDefFoundError当您在初始化静态变量或执行静态块初始化程序时出现异常时也会出现。检查你的课程,也许它会抛出这样的异常。

于 2012-10-22T17:56:05.043 回答
0

我认为您想使用newInstance() 方法。由于您有“Class loadedVersion”,您可以使用它来调用该方法。

于 2012-10-22T17:58:46.703 回答
0

这是我对原始问题的解决方案(答案)。我仍然不认为这是理想的,但这确实有效。

我创建了一个“引导”应用程序,它首先加载所有自定义的 3rd 方 jar,然后加载并调用我的应用程序类。通过这种方式,我可以获得第 3 方 jar 的自动完成和来源提示。

我希望这对某人有所帮助,或邀请进一步的评论。

于 2012-12-11T20:41:32.740 回答