反射调用时的包装异常

1、基本介绍
  • 通过反射调用方法 → 方法内部抛异常 → 反射框架捕获并包装成 InvocationTargetException → 其 getCause() 才是真正的异常
2、演示
public class Demo {
    public void problematicMethod() {
        int result = 10 / 0;
    }

    public void checkedExceptionMethod() throws Exception {
        throw new Exception("业务异常");
    }
}
try {
    Class<?> clazz = Class.forName("com.reflection.Demo");

    Constructor<?> constructor = clazz.getDeclaredConstructor();

    Object instance = constructor.newInstance();

    Method method = clazz.getMethod("problematicMethod");

    method.invoke(instance);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    System.err.println("外层异常: " + e.getClass().getSimpleName());
    System.err.println(e.getMessage());
    System.err.println("真实原因: " + e.getCause());
    e.getCause().printStackTrace();
}
# 输出结果

外层异常: InvocationTargetException
null
真实原因: java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
try {
    Class<?> clazz = Class.forName("com.reflection.Demo");

    Constructor<?> constructor = clazz.getDeclaredConstructor();

    Object instance = constructor.newInstance();

    Method method = clazz.getMethod("checkedExceptionMethod");

    method.invoke(instance);
} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    System.err.println("外层异常: " + e.getClass().getSimpleName());
    System.err.println(e.getMessage());
    System.err.println("真实原因: " + e.getCause());
    e.getCause().printStackTrace();
}
# 输出结果

外层异常: InvocationTargetException
null
真实原因: java.lang.Exception: 业务异常
java.lang.Exception: 业务异常

更多推荐