class.getdeclaredconstructor()可获取任意访问修饰符的构造函数,但需调用setaccessible(true)才能调用;仅查找当前类声明的构造函数,不包括父类;参数类型必须精确匹配(如int.class≠integer.class);调用时需处理nosuchmethodexception、illegalaccessexception等异常。

在 Java 中,Class.getDeclaredConstructor() 可以获取任意访问修饰符(包括 private、protected)的构造函数,但默认无法直接调用。要成功调用,必须配合 setAccessible(true) 绕过 Java 的访问控制检查——这是反射机制的关键一步。
获取指定参数类型的受保护/私有构造函数
使用 getDeclaredConstructor(Class...) 明确指定参数类型,避免因重载导致匹配错误。注意:该方法只查找**当前类声明的**构造函数,不包括父类的。
- 若构造函数带参,必须传入准确的
Class对象(如String.class、int.class) - 对于基本类型,不能用包装类代替(
int.class≠Integer.class) - 若找不到匹配构造函数,抛出
NoSuchMethodException
调用前必须设为可访问
即使成功获取到 Constructor 对象,直接调用 newInstance() 会触发 IllegalAccessException。必须先调用 setAccessible(true):
- 该操作仅影响当前
Constructor实例,不影响其他反射对象或运行时安全策略 - 在安全管理器(SecurityManager)启用的环境中,可能抛出
SecurityException - 建议用 try-catch 包裹,并在必要时记录警告(例如:绕过封装应有明确理由)
安全调用并处理异常
完整流程需兼顾 InvocationTargetException(构造函数内部抛出的异常被包装)、InstantiationException(类是接口/抽象类/数组类型)等:
- 构造函数抛出的原始异常可通过
e.getCause()获取 - 若构造函数有参数,传入的实参类型和数量必须严格匹配
- 推荐使用泛型
Constructor<t></t>避免强制转型,提升类型安全性
实际示例:调用私有单参构造函数
假设有一个类:
class Person {
private String name;
private Person(String name) { this.name = name; }
}
调用方式如下:
try {
Constructor<person> ctor = Person.class.getDeclaredConstructor(String.class);
ctor.setAccessible(true);
Person p = ctor.newInstance("Alice");
} catch (NoSuchMethodException | IllegalAccessException
| InvocationTargetException | InstantiationException e) {
// 分别处理不同异常
}</person>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











