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

时间:2015-06-29 09:38:54

标签: java classloader

我试图为我的一个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
    )

1 个答案:

答案 0 :(得分:1)

要让var highlighters = new Action<HighlightFieldDescriptor<YourObject>>[3]; highlighters[0] = h => h.OnField("field1"); highlighters[1] = h => h.OnField("field2"); highlighters[2] = h => h.OnField("field3"); searchDescriptor.Highlight(h => h.OnFields(highlighters)); 工作,您必须通过Class.forName()注册新的类加载器。

另见https://stackoverflow.com/a/4096399/1015327

或者,您可以尝试myClassloader.findClass()