全部学科
Python全栈
python
NodeJS全栈
nodejs
📅 2026-05-11 6 分钟 ✍️ juanwangdev

Java构造器反射

通过反射获取构造器并创建对象,是反射机制的核心应用之一。

获取构造器

获取公共构造器

Java
Class<?> clazz = Person.class;

// 获取所有公共构造器
Constructor<?>[] publicConstructors = clazz.getConstructors();

// 获取指定参数的公共构造器
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);

获取所有构造器(包括私有)

Java
// 获取所有声明的构造器
Constructor<?>[] allConstructors = clazz.getDeclaredConstructors();

// 获取指定参数的构造器(包括私有)
Constructor<?> privateConstructor = clazz.getDeclaredConstructor(String.class);

创建对象实例

使用newInstance()

Java
Class<?> clazz = Person.class;

// 无参构造
Object obj1 = clazz.getDeclaredConstructor().newInstance();

// 有参构造
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj2 = constructor.newInstance("张三", 25);

处理私有构造器

Java
// 获取私有构造器
Constructor<?> privateConstructor = clazz.getDeclaredConstructor(String.class);

// 暴力反射:取消访问检查
privateConstructor.setAccessible(true);

// 创建实例
Object obj = privateConstructor.newInstance("私有构造");

Constructor常用方法

Java
Constructor<?> constructor = clazz.getConstructor(String.class);

// 获取构造器信息
String name = constructor.getName();           // 构造器名称
int modifiers = constructor.getModifiers();    // 修饰符
Class<?>[] paramTypes = constructor.getParameterTypes();  // 参数类型
int paramCount = constructor.getParameterCount();        // 参数个数

// 获取参数信息(Java 8+)
Parameter[] params = constructor.getParameters();
for (Parameter param : params) {
    String paramName = param.getName();
    Class<?> paramType = param.getType();
}

// 创建实例
Object instance = constructor.newInstance(args...);

实际应用示例

Java
public class Person {
    private String name;
    private int age;

    public Person() {}

    public Person(String name) {
        this.name = name;
    }

    private Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

// 反射创建实例
Class<?> clazz = Person.class;

// 无参构造
Person p1 = (Person) clazz.getDeclaredConstructor().newInstance();

// 公共有参构造
Person p2 = (Person) clazz.getConstructor(String.class)
                          .newInstance("李四");

// 私有构造
Constructor<?> privateCons = clazz.getDeclaredConstructor(String.class, int.class);
privateCons.setAccessible(true);
Person p3 = (Person) privateCons.newInstance("王五", 30);

getConstructors与getDeclaredConstructors区别

方法范围访问权限
getConstructors()本类仅public
getDeclaredConstructors()本类所有(含private)
getConstructor()本类仅public
getDeclaredConstructor()本类所有(含private)

注意事项

私有构造器必须先调用 setAccessible(true) 才能创建实例

newInstance() 在Java 9后被标记为废弃,推荐使用 getDeclaredConstructor().newInstance()

反射创建对象不会走编译时类型检查,需自行确保参数类型正确

要点总结

  1. getConstructors() 获取公共构造器,getDeclaredConstructors() 获取所有构造器
  2. 使用 constructor.newInstance() 创建对象实例
  3. 私有构造器需要 setAccessible(true) 突破访问限制
  4. 反射创建对象破坏了封装性,应谨慎使用
想在手机上练习这篇文章的配套题目?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一篇 Java Class对象获取
下一篇 → Java方法反射
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码