You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么子类默认构造方法无法通过Java反射API获取?

底层原理说明

核心问题是你对Class类两个获取构造方法的API的作用范围理解有误,同时忽略了默认构造方法的访问权限规则:

1. 反射API的权限限制

  • getConstructors() 方法仅能返回当前类中被public修饰的构造方法,非public的构造方法会被直接过滤
  • 如果你要获取当前类所有声明的构造方法(不限制访问权限),需要调用getDeclaredConstructors()方法

2. 默认构造方法的访问权限规则

Java编译器为没有显式声明构造方法的类生成默认无参构造方法时,构造方法的访问修饰符和类本身的访问修饰符完全一致。
你代码中的TestB类没有添加public修饰符,属于包级私有权限,所以它的默认无参构造方法也是包级私有,不属于public方法,自然无法被getConstructors()查询到。

3. 直接new不报错的原因

你的TestA和TestB处于同一个包下,包级私有权限允许同包下的类直接访问,所以new TestB()完全符合Java访问控制规则,可以正常实例化。

4. 反射调用的正确写法

如果你需要用反射获取TestB的无参构造,应该用如下代码:

// 获取所有访问级别的无参构造
Constructor<TestB> constructor = TestB.class.getDeclaredConstructor();
// 如果是跨包访问需要加这行开启权限,同包访问可以省略
constructor.setAccessible(true);
TestB instance = constructor.newInstance();

你可以做个验证:把TestB的类修饰符改成public,再运行原代码,getConstructors()就能正常返回对应的构造方法了。

内容的提问来源于stack exchange,提问作者Nighley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 16:21:02