Java反射可通过getDeclaredConstructor()获取私有构造函数,调用setAccessible(true)绕过访问检查后,用newInstance()创建实例;但受模块系统、安全管理器及性能限制,应谨慎使用。

Java 反射允许访问非 public 构造函数,但需先调用 setAccessible(true) 绕过 Java 访问控制检查;否则会抛出 IllegalAccessException。
获取私有/包级构造函数
使用 getDeclaredConstructor()(注意不是 getConstructor())可获取任意声明的构造函数,包括 private、protected 和默认(包级)访问权限的构造函数:
-
getDeclaredConstructor()不带参数时,查找无参构造函数 -
getDeclaredConstructor(Class...)可指定参数类型精确匹配重载构造函数,例如String.class, int.class - 若目标类没有对应声明的构造函数,会抛出
NoSuchMethodException
绕过访问限制并创建实例
获取到 Constructor 对象后,必须显式调用 setAccessible(true) 才能成功调用:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 这是关键步骤,缺省会导致
IllegalAccessException - 调用
newInstance(Object...)(Java 9+ 推荐用newInstance的替代方法constructor.newInstance(...))传入实际参数 - 若构造函数抛出异常(如
IllegalArgumentException或自定义异常),会被包装为InvocationTargetException抛出
完整示例代码
假设有一个类:class Person {<br> private String name;<br> private int age;<br> Person(String name, int age) {<br> this.name = name;<br> this.age = age;<br> }<br>}
可通过以下方式实例化:
Constructor<person> ctor = Person.class.getDeclaredConstructor(String.class, int.class);</person>ctor.setAccessible(true);Person p = ctor.newInstance("Alice", 30);
注意事项与限制
反射调用私有构造函数在现代开发中应谨慎使用:
立即学习“Java免费学习笔记(深入)”;
- 模块系统(Java 9+)下,若类所在模块未对反射调用方模块开放(
opens或exports),即使setAccessible(true)也可能失败 - 安全管理器(SecurityManager)启用时会阻止该操作(已弃用但部分环境仍存在)
- 某些框架(如 Spring、Lombok)生成的类可能因字节码优化导致反射行为异常
- 频繁反射影响性能,且破坏封装性,建议仅用于测试、序列化、DI 容器等必要场景

















