【发布时间】:2013-07-21 04:57:12
【问题描述】:
我是 java 反射/动态加载的初学者。我想从 jar 文件中加载一个特定的类(实现接口)。此外,我想初始化这个类的一个对象并将其转换为我的特定接口。
我尝试了.loadClass()、class.forName(),如果我将Myclass.newInstance 转换为我的接口,我会得到一个ClassCastException。
我如何编写我的插件加载器,以便将我的类加载到我的 jar 中并将其转换为 myInterface?
编辑
我的服务器与我的插件实现的接口相同。现在我希望我的插件“加载”并转换到我的界面,以便我可以正常使用它们。
编辑
这是我尝试摆脱这些错误的一些示例代码:D
URL url = f.toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class<ModInterface> c = (Class<ModInterface>)cl.loadClass("com.myapp.mod");
Class<? extends ModInterface> sub = c.asSubclass(ModInterface.class);
Constructor<? extends ModInterface> con = sub.getConstructor();
ModInterface mi = con.newInstance();
我所做的另一个代码示例:
ClassLoader loader = PluginLoader.class.getClassLoader();
URL url = new URL("jar:file:" + f.getAbsolutePath() + "!/");
URLClassLoader ucl = new URLClassLoader(new URL[] { url }, loader);
Class iInterfaceClass = Class.forName("com.myapp.mod", true, ucl);
ModInterface mi = (ModInterface) iInterfaceClass.newInstance();
错误:
java.lang.ClassCastException: com.myapp.mod cannot be cast to myapp.ModInterface
在您提供一些帮助后,我完成了以下操作:
URL url = f.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader loader = ModInterface.class.getClassLoader();
ClassLoader cl = new URLClassLoader(urls, loader);
Class<?> loadedClass = Class.forName("com.myapp.mod", true, cl);
Class<? extends ModInterface> pluginClass = loadedClass.asSubclass(ModInterface.class);
ModInterface mi = pluginClass.newInstance();
现在我收到此错误 -> java.lang.ClassCastException: class com.myapp.mod throw at loadedClass.asSubclass(..); 找到了特定的类,因为如果我将 com.myapp.mod 更改为它抛出 classnotfound execption 的任何内容。我尝试使用 ModInterface ClassLoader,但没有任何改变。 with(out) 我会得到同样的错误。
注意:// 我使用 2 个项目。 1 用于我的服务器应用程序,另一个用于我应该加载的插件。两者具有相同的接口。
编辑://
使用这段代码,我从我想要的类中获得了一个 Object 类型的对象,但它不是我的 ModInterface 的实例,尽管我的类实现了我的 ModInterface。如果我尝试将我的对象转换为我的 ModInterface,则会出现错误。这是我的短代码:
Class c = clazzLoader.loadClass(element.getName().replaceAll(".class", "").replaceAll("/", "."));
Object instance = c.newInstance();
【问题讨论】:
-
愿意发布您尝试过的代码吗?另外,你有使用反射的理由吗?让编译器确保代码的类型安全通常是首选,除非您有一些必须推迟到运行时。
-
我有点失败,我想从 Jar 文件加载一个类,这个类实现了一个接口。生成的对象应该被转换为这个已知的接口,所以我可以在我的插件加载器中正常使用它。不,我在发布代码时没有问题,但我无法在 8 小时内回答我的主题,因为它出现在规则中。
-
您无需回答您的主题。只需编辑您的问题并发布代码。
-
代码已添加,希望你能帮助我:)
-
标题中无需添加major标签。
标签: java class dynamic reflection classcastexception