直接用class.getdeclaredconstructor().newinstance()创建无参对象可行,但需处理访问权限(private需setaccessible(true))和异常(nosuchmethodexception等),jdk15+推荐改用constructor.newinstantiator()。

直接用 Class.getDeclaredConstructor().newInstance() 创建无参对象是可行的,但要注意访问权限和异常处理。
确保构造方法可访问
无参构造方法默认是 public 时可直接调用;如果是 private 或包私有,必须先调用 setAccessible(true) 打破封装限制。
- 不设 accessible 会抛出 IllegalAccessException
- 即使构造方法是 public,反射获取的
getDeclaredConstructor()返回的是声明的构造器(含 private),不是自动过滤后的 public 版本
正确写法示例
以类 Person 为例:
try {
Person obj = Person.class.getDeclaredConstructor().newInstance();
} catch (NoSuchMethodException | InstantiationException |
IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
如果 Person() 是 private,需加一行:
Constructor<person> ctor = Person.class.getDeclaredConstructor(); ctor.setAccessible(true); // 关键! Person obj = ctor.newInstance();</person>
注意替代方案
Java 9+ 推荐优先使用 Class.getDeclaredConstructor().newInstance() 的替代方式 —— Constructor.newInstance() 本身已足够,无需额外反射工具类;但更现代、更安全的方式是:
- 若类有 public 无参构造,直接用
clazz.getConstructor().newInstance()(只找 public 构造) - 避免滥用
getDeclaredConstructor()+setAccessible(true),除非确实需要访问非 public 构造 - JDK 15+ 中
newInstance()已标记为 deprecated,推荐改用Constructor.newInstantiator()(需配合MethodHandles)或保持原方式并捕获异常
常见陷阱
容易忽略的细节:
-
getDeclaredConstructor()不接受参数,括号内为空 —— 写成getDeclaredConstructor(void.class)或带参数会报错 - 目标类没有无参构造时,抛
NoSuchMethodException,不是NullPointerException - 构造方法内部抛异常(如初始化失败),会包装成
InvocationTargetException,需检查e.getCause()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











