全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 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方法反射
下一篇 → Java注解处理器
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库