485. Java 反射 - 获取构造器声明的异常

0 阅读1分钟

485. Java 反射 - 获取构造器声明的异常

在 Java 中,构造器和方法一样,也可以声明会抛出的异常。通过反射,Constructor 类提供了两种方式来获取这些异常:

  1. getExceptionTypes() → 返回 Class<?>[],代表异常的原始类型
  2. 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 框架):在实例化对象时,需要捕获构造器可能抛出的异常
    • 工具类(如序列化、动态代理):通过反射调用构造器时,需要正确处理受检异常