getConstructors仅返回public构造器,getDeclaredConstructors返回所有声明的构造器(含protected/default/private),二者均不包含父类构造器;非public构造器需调用setAccessible(true)才能实例化。

核心区别就一条:getConstructors 只返回 public 构造方法,getDeclaredConstructors 返回当前类声明的所有构造方法(public、protected、default、private)。两者都不包含父类的构造方法。
作用范围完全一致:只查本类,不查继承
无论用哪个方法,都只能拿到当前 Class 对象所代表的那个类自己写的构造方法。父类的构造器不会被包含进来——Java 中构造器不能被继承,所以反射也不提供“向上查找”的能力。
- 比如
Fruit类有 public Fruit(),子类Apple没写任何构造器,那么Apple.class.getConstructors()返回空数组 - 即使
Apple显式写了 private Apple(),getConstructors()仍为空;但getDeclaredConstructors()会返回它
访问权限决定是否可见
getConstructors 是“对外可见视角”:只暴露能被其他类直接调用的 public 构造器,符合封装原则。
getDeclaredConstructors 是“内部完整视角”:把类源码里定义的每个构造器都列出来,不管修饰符是什么。
- public 构造器:两个方法都会返回
- protected / default / private 构造器:仅 getDeclaredConstructors 返回
- 若类本身是 default(包私有)类,它的默认构造器也是 default 修饰的 → getConstructors 拿不到,必须用 getDeclaredConstructors
实际使用时的关键配套操作
拿到非 public 构造器后,不能直接 newInstance(),否则抛 IllegalAccessException。必须先调用 setAccessible(true) 打开访问权限:
Constructor> c = clazz.getDeclaredConstructor(String.class);c.setAccessible(true); // 关键一步Object obj = c.newInstance("hello");
注意:setAccessible 不仅放开构造器权限,还能绕过类本身的访问限制(例如对 package-private 类中的 public 构造器也需调用)。
什么时候选哪个?
按需求场景选:
- 想模拟 new 实例化逻辑,且只接受公开 API → 用 getConstructors 或 getConstructor(参数类型)
- 做框架、序列化、测试工具,需要完整掌控对象创建过程 → 用 getDeclaredConstructors + setAccessible
- 检查类设计是否合理(比如误写了 private 无参构造却忘了提供 public 替代)→ 用 getDeclaredConstructors 对比 getConstructors 结果











