484. Java 反射 - 获取构造器的参数

484. Java 反射 - 获取构造器的参数

和方法类似,构造器也有参数。通过反射我们可以读取这些参数的:

  • 原始类型:通过 getParameterTypes() 返回 Class<?>[]
  • 泛型类型:通过 getGenericParameterTypes() 返回 Type[],保留了泛型信息

1. 获取原始参数类型

下面的示例查询 ArrayList 的所有构造器,并打印它们的参数类型:

import java.lang.reflect.*;
import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        Class<?> c = ArrayList.class;
        Constructor<?>[] constructors = c.getConstructors();

        for (Constructor<?> constructor : constructors) {
            System.out.println("Constructor with " + constructor.getParameterCount() + " parameter(s)");
            for (Class<?> type : constructor.getParameterTypes()) {
                System.out.println("   " + type.getName());
            }
        }
    }
}

输出结果(JDK 17+):

Constructor with 1 parameter
   java.util.Collection
Constructor with 0 parameter
Constructor with 1 parameter
   int

📌 说明

  • ArrayList(Collection<? extends E> c) → 被擦除成 Collection
  • ArrayList(int initialCapacity) → 参数类型是 int
  • ArrayList() → 无参构造器

2. 获取泛型参数类型

如果想保留泛型信息,可以使用 getGenericParameterTypes()

Class<?> c = ArrayList.class;
Constructor<?>[] constructors = c.getConstructors();

for (Constructor<?> constructor : constructors) {
    System.out.println("Constructor with " + constructor.getParameterCount() + " parameter(s)");
    for (Type type : constructor.getGenericParameterTypes()) {
        System.out.println("   " + type.getTypeName());
    }
}

输出结果:

Constructor with 1 parameter
   java.util.Collection<? extends E>
Constructor with 0 parameter
Constructor with 1 parameter
   int

📌 说明

  • 这里泛型信息得以保留:Collection<? extends E>
  • 但由于 Java 的 泛型擦除,运行时你依然无法区分 ArrayList<String>ArrayList<Integer> 的构造器,反射只能看到泛型声明本身。

3. 总结

  • getParameterTypes() → 获取参数的 原始类型(泛型擦除后)
  • getGenericParameterTypes() → 获取参数的 泛型类型(声明信息)
  • ArrayList 示例展示了三种常见构造器:无参、容量型、集合拷贝型
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容