我是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();