繁体   English   中英

Java ClassLoader-外部jar中的转换方法

[英]Java ClassLoader - Casting methods in external jars

我试图为我的一个Java项目创建一个插件系统,所以我试图用classloader来做,但是当我尝试我的方法时,它给了我ClassNotFound异常。 我只是无法正常工作,有人可以帮我吗? 对不起,我的英语不好。

我的方法:

public void loadPlugin(String jarname) throws Exception {
    File f = new File("server'\\" + jarname + ".jar");
    URL url = f.toURL();
    URL[] urls = new URL[]{url};
    URLClassLoader child = new URLClassLoader (urls, this.getClass().getClassLoader());
    Class classToLoad = Class.forName ("me.daansander.plugin.Plugin", true, child);
    Method method = classToLoad.getDeclaredMethod ("onEnable");
    Object instance = classToLoad.newInstance ();
    Object result = method.invoke (instance);

堆栈跟踪:

java.lang.ClassNotFoundException: me.daansander.plugin.Plugin
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at me.daansander.serverchecker.plugin.ServerPlugin.loadPlugin(ServerPlug
    in.java:59)
    at me.daansander.serverchecker.plugin.ServerPlugin.start(ServerPlugin.ja
    va:40)
    at me.daansander.serverchecker.ServerChecker.<init>(ServerChecker.java:3
    9)
    at me.daansander.serverchecker.ServerChecker.main(ServerChecker.java:124
    )

为了使Class.forName()工作,您必须通过Thread.currentThread().setContextClassLoader(myClassLoader)注册新的类加载器。

另请参阅https://stackoverflow.com/a/4096399/1015327

另外,您可以尝试myClassloader.findClass()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM