2012-03-27 76 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