2012-03-27 79 views
2

我还有另一个问题,答案让我无法回避。我希望在运行时从外部jar中获取一个类,并从中获取一个方法并将其传递给一个参数。我目前的代码打开jar并抓住类并运行该方法,但当我尝试并传递给它一个参数时,该方法运行,但我得到一个InvocationTargetException。有任何想法吗?Java在运行时加载外部类

这里是我的代码:

String path = "test.jar"; 
    URL[] classes = {new File(path).toURI().toURL()}; 
    URLClassLoader child = new URLClassLoader (classes, this.getClass().getClassLoader()); 
    try { 
     Class classToLoad = Class.forName("testClass", true, child); 
     Method method = classToLoad.getDeclaredMethod ("testMethod", String.class); 
     Object instance = classToLoad.newInstance(); 
     Object result = method.invoke(instance, new String("Test from method!")); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

这里是它引发的错误:

Test from method! 
java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at Load.loadJar(LoadTerrem.java:33) 
    at Load.<init>(LoadTerrem.java:18) 
    at Load.main(LoadTerrem.java:13) 
Caused by: java.lang.NullPointerException 
    at MenuSingleplayer.LoadWorlds(MenuSingleplayer.java:210) 
    at MenuSingleplayer.setup(MenuSingleplayer.java:89) 
    at M0.LoadGame(M0.java:76) 
    ... 7 more 

正如你可以看到,该方法执行,打印出来传递给它的字符串,但随后抛出一个错误就行了:

Object result = method.invoke(instance, new String("Test from LoadTerrem!")); 

有什么想法吗?谢谢!

+0

哪一条是第33行? – 2012-03-27 21:41:55

回答

3

InvocationTargetException时被调用的方法(testMethod你的情况)抛出一个异常被抛出。来自文档:

InvocationTargetException是一个检查的异常,它包装由调用的方法或构造函数抛出的异常。

从您的堆栈跟踪情况来看(以下简称“引发的”双组分要准确),它看起来像testMethod导致MenuSingleplayer.LoadWorlds被调用,这引起了NullPointerException。这NullPointerException传播,直到它到达反射电话,在这一点上它被包裹在InvocationTargetException

+0

感谢您的解释 – MrDrProfessorTyler 2012-03-27 21:48:35

+0

不客气。 (我也在这里学到了东西!:) – aioobe 2012-03-27 21:51:21

3

问题出在MenuSingleplayer.LoadWorlds方法中。它说在那里发生了NPE。与反思无关。这是确定的:

Caused by: java.lang.NullPointerException 
at MenuSingleplayer.LoadWorlds(MenuSingleplayer.java:210) 
+0

嗯,我现在觉得有点......愚蠢。谢谢,虽然你解决了它! – MrDrProfessorTyler 2012-03-27 21:43:55