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()
反射创建对象不会走编译时类型检查,需自行确保参数类型正确
要点总结
- getConstructors() 获取公共构造器,getDeclaredConstructors() 获取所有构造器
- 使用 constructor.newInstance() 创建对象实例
- 私有构造器需要 setAccessible(true) 突破访问限制
- 反射创建对象破坏了封装性,应谨慎使用
📝 发现内容有误?点击此处直接编辑