为什么子类默认构造方法无法通过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
相关产品推荐
相关产品推荐

