我确信这对大多数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
这是“问题”。我想在编辑器中“明白地”使用我的课程(我真的不知道正确的单词)。我不想加载每个单独的方法 - 这不是类加载器的用途吗?
答案 0 :(得分:0)
如果你只有类路径上的接口并通过类加载器或其他任何东西加载实现会更好,如下面的代码所示:
Class loadedVersion = Class.forName("org.example.MyClass");
IMyClass m = (IMyClass)loadedVersion.newInstance();
其中IMyClass是由org.example.MyClass
实现的接口。
通过这种方式,您可以绝对地将类的实现与客户端代码
修改强>
当初始化静态变量或执行静态块初始化程序时出现异常时,也会出现 NoClassDefFoundError
。检查你的课程,也许它会抛出这样的例外。
答案 1 :(得分:0)
我想你想使用newInstance() method。由于你有“Class loadedVersion”,你可以用它来调用方法。
答案 2 :(得分:0)
这是我对原始问题的解决方案(答案)。我仍然不认为这是理想的,但这确实有用。
我创建了一个“bootstrap”应用程序,它首先加载所有自定义的第三方jar,然后加载并调用我的应用程序类。通过这种方式,我获得了第三方罐子的自动完成和源提示。
我希望这有助于某人,或邀请进一步的评论。