InvocationTargetException是什么异常?
InvocationTargetException 是 Java 反射机制中的包装异常,专门用于表示:
💥 你通过 Method.invoke() 调用某个方法时,该方法内部抛出了异常,JVM 不会直接把那个异常抛出来,而是会用一个 InvocationTargetException 把它包裹起来。
🔧 官方定义(Java Doc 简化):
public class InvocationTargetException extends ReflectiveOperationException {
private Throwable target;
}
✅ 场景举例
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) throws Exception {
Method method = Test.class.getDeclaredMethod("fail");
try {
method.invoke(null); // 反射调用失败方法
} catch (InvocationTargetException e) {
System.out.println("发生 InvocationTargetException");
System.out.println("真实异常是:" + e.getCause());
}
}
public static void fail() {
throw new IllegalArgumentException("我是方法内部抛出的异常");
}
}
输出:
发生 InvocationTargetException
真实异常是:java.lang.IllegalArgumentException: 我是方法内部抛出的异常
🧠 为什么设计这个异常?
反射调用的 invoke(...) 方法签名只声明了它会抛出 Throwable:
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;
所以一旦反射调用的内部出现任何异常,JVM 需要一种方式来让你区分是:
-
反射本身错了?(比如权限不对)
-
还是被调用方法真的自己报错了?
因此才用 InvocationTargetException 来包裹真实异常。
✅ 获取真实异常的方式:
e.getCause()
e.getTargetException() // 等价
⚠️ 常见问题:
|
问题 |
解释 |
|---|---|
|
为什么不直接抛出真实异常? |
因为 invoke 方法不能改变签名,只能抛 InvocationTargetException 包装它 |
|
InvocationTargetException 是运行时异常吗? |
❌ 不是,它是 受检异常,你必须处理或声明它 |
✅ 总结
|
属性 |
值 |
|---|---|
|
属于 |
java.lang.reflect 包 |
|
类型 |
受检异常 |
|
用于 |
反射调用的方法内部抛出异常时的“中介” |
|
关键方法 |
getCause() 获取原始异常 |
浙公网安备 33010602011771号