[英]How to invoke a method which throws an Exception using Java Reflection?
我想使用Java Reflection調用一個方法。
問題是這個方法(我寫的)拋出一個Exception(我創建了一個myCustomException )。 當我添加一個try / catch子句時,我無法運行我的項目,因為Eclipse說“catch子句無法訪問”。
這是我嘗試在類MyClass中調用myMethod的時候:
270. myMethod.invoke(null, myParam); // NB : null because myMethod is static
當myMethod沒有拋出MyCustomException時 ,eveything就可以了。 但是當它拋出MyCustomException時 ,我收到以下錯誤消息:
比方說,我嘗試調用fooMethod(),這是在類BarClass()和:
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 com.tests.MyClass.test5(270)
at com.tests.MyClass.main(297)
Caused by: com.tests.MyCustomException
at com.tests.barClass.fooMethod(BarClass.java:129)
... 6 more
它甚至可能嗎? 無論如何,謝謝你的幫助。
你可以得到它的原因,這將是原始的例外。
InvocationTargetException.getCause();
來自文檔:
InvocationTargetException是一個已檢查的異常,它包裝被調用的方法或構造函數拋出的異常。
http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/InvocationTargetException.html
在catch塊中,您可以檢查異常是否來自您期望的類型並處理它。
一個簡單的方法是:
try {
...
} catch (InvocationTargetException ite) {
if (ite.getCause() instanceof SomeExceptionType) {
...
} else {
...
}
}
一種方法:
try { myMethod.invoke(null, myParam); }
catch (InvocationTargetException e) {
try { throw e.getCause(); }
catch (MyCustomException e) { ...}
catch (MyOtherException e) { ...}
}
如果您嘗試在執行myMethod.invoke(null, myParam)
的方法中添加catch
子句,那么這顯然不是正確的方法。 在這種情況下,您通過反射調用該方法,這不是捕獲異常的地方,因為invoke
方法拋出其他異常。 一旦你調用拋出異常的方法,如果有異常,它將被拋出並包裝在InvocationTargetException
,如果我沒記錯的話。
檢查有關InvocationTargetException
的此解釋的最后部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.