InvocationTargetException
當java反射調用方拋出異常時,就會用InvocationTargetException將原異常包裹;
UndeclaredThrowableException
java動態代理時拋出的異常。當對某接口進行動態代理,接口的方法名稱上未聲明某類受檢異常,而方法卻拋出了該異常,動態代理會將該異常用UndeclaredThrowableException包裹。
由於jdk動態代理內部會調用method.invoke進行調用,當method拋出異常時,則會拋出InvocationTargetException。
由於InvocationTargetException是受檢異常,當代理接口方法未標識InvocationTargetException,則拋出UndeclaredThrowableException
處理方法:
public static Throwable unwrapThrowable(Throwable wrapped) {
Throwable unwrapped = wrapped;
while (true) {
if (unwrapped instanceof InvocationTargetException) {
unwrapped = ((InvocationTargetException) unwrapped).getTargetException();
} else if (unwrapped instanceof UndeclaredThrowableException) {
unwrapped = ((UndeclaredThrowableException) unwrapped).getUndeclaredThrowable();
} else {
return unwrapped;
}
}
}