gpt4 book ai didi

java - 如果项目从 Eclipse 运行,则 Instanceof 可以工作,但在导出时则不行

转载 作者:行者123 更新时间:2023-12-01 09:39:57 24 4
gpt4 key购买 nike

我正在开发一个必须从文件夹动态加载 .jar 文件的项目。它从以 .jar 结尾的文件夹中获取所有文件,然后打开它们。然后它获取 jar 文件中以 .class 结尾的每个文件并加载它。然后,我使用以下代码检查该类是否扩展了 LeafPlugin:

Class<?> clazz = classloader.loadClass(classname);
Object object = clazz.newInstance();
if(object instanceof LeafPlugin){
// Load LeafPlugin
}else{
System.out.println("Class '" + classname + "' isn't a LeafPlugin");
}

虽然这对于 eclipse 内导出的 DemoPlugin 效果很好,但如果导出项目,则会打印出该类不是 LeafPlugin 的消息。是什么导致了这种奇怪的行为?

我在插件的构建路径中有这个项目,因此 LeafPlugin 应该没有不同。

我尝试过使用LeafPlugin.class.isAssignableFrom(clazz),但它没有改变任何东西。在 Eclipse 中运行它与在导出时运行它有什么不同?

完整代码可以在 here 找到(数量不少,看一下 LeafPluginLoader 即可)

最佳答案

问题在于您如何在 LeafPluginLoader 中定义 ClassLoader。您没有在问题中提供它的代码(它在您的 GitHub 上)。你把它当作

URLClassLoader cl = URLClassLoader.newInstance(urls);

问题是这个类加载器对您当前的 LeafPlugin 类一无所知。您需要传递 ClassLoader 实例,该实例还加载了 LeafPlugin 类。

URLClassLoader cl = URLClassLoader.newInstance(urls, LeafPlugin.class.getClassLoader());

<小时/>

现在我对类加载器行为的了解还不足以真正详细解释为什么会出现这种情况,但是简单地说,您必须这样做,因为类加载器具有它所知道的类范围。加载插件时,如果加载插件的类加载器不知道 LeafPlugin 类,那么您就会遇到问题。

关于java - 如果项目从 Eclipse 运行,则 Instanceof 可以工作,但在导出时则不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38540853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com