我還有另一個問題,答案讓我無法迴避。我希望在運行時從外部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!"));
有什麼想法嗎?謝謝!
哪一條是第33行? – 2012-03-27 21:41:55