485. Java 反射 - 获取构造器声明的异常
在 Java 中,构造器和方法一样,也可以声明会抛出的异常。通过反射,Constructor 类提供了两种方式来获取这些异常:
getExceptionTypes()→ 返回Class<?>[],代表异常的原始类型getGenericExceptionTypes()→ 返回Type[],保留泛型信息(如果有)
1. 示例:FileWriter 构造器
我们来查看 FileWriter 的一个构造器:
import java.io.*;
import java.lang.reflect.*;
public class Demo {
public static void main(String[] args) throws Exception {
Class<?> c = FileWriter.class;
// 获取参数为 String 的构造器
Constructor<?> constructor = c.getConstructor(String.class);
// 获取异常类型(原始类型)
for (Class<?> exceptionType : constructor.getExceptionTypes()) {
System.out.println("Exception type: " + exceptionType.getName());
}
// 获取异常类型(泛型信息)
for (Type exceptionType : constructor.getGenericExceptionTypes()) {
System.out.println("Generic exception type: " + exceptionType.getTypeName());
}
}
}
2. 运行结果
Exception type: java.io.IOException
Generic exception type: java.io.IOException
📌 说明:
FileWriter(String fileName)构造器声明了throws IOException- 因此无论是 原始类型 还是 泛型类型,都返回
java.io.IOException - 如果构造器声明多个异常,比如
throws IOException, SecurityException,那么反射会返回对应的两个元素
3. 总结
- ✅ 构造器和方法一样,能通过反射获取其声明的异常
- ✅
getExceptionTypes()→ 原始类型数组 - ✅
getGenericExceptionTypes()→ 泛型信息(通常和原始类型一致) - ✅ 常见应用场景:
- 框架开发(如 Spring、ORM 框架):在实例化对象时,需要捕获构造器可能抛出的异常
- 工具类(如序列化、动态代理):通过反射调用构造器时,需要正确处理受检异常