java - 为什么子类的默认构造函数不能通过反射获得?
问题描述
运行时:
import java.util.Arrays;
public class TestA {
public static void main(String[] args) {
System.out.println(Arrays.toString(TestB.class.getConstructors()));
}
}
class TestB extends TestA {
}
结果将是
[]
使用反射调用默认构造函数时,代码将崩溃并显示NoMethodFoundException: TestB.<init>()
. 所以不知何故JVM不知道有一个默认构造函数。但是当你简单的调用时new TestB()
,一切都很好(应该是这样)。
除此之外,当我反编译 .class 文件时,两个类都有一个默认构造函数。
引擎盖下发生了什么或我错过了什么?
解决方案
返回一个包含 Constructor 对象的数组,该对象反映了此 Class 对象表示的类的所有公共构造函数。
的构造函数TestB
是不公开的!根据JLS §8.8.9:
如果类不包含构造函数声明,则隐式声明默认构造函数。顶级类、成员类或本地类的默认构造函数形式如下:
- 默认构造函数与类具有相同的可访问性。
- ...
TestB
具有“包”访问级别(无访问修饰符),因此默认构造函数也具有该访问级别。因此,getConstructors
不将其包含在其返回的数组中。事实证明,这与TestB
成为TestA
.
如果你想得到它,使用getDeclaredConstructors
.
推荐阅读
- jquery - jquery如何在点击关闭后再次开启?
- awk - 如何以预定义的时间将音频文件拆分为多个章节
- excel - 联盟没有选择所有范围
- mysql - 尝试构建一个 SQL 查询 (MySQL) 来计算一年中每个月的每个设施的预订数量
- scala - Spark节点不断打印GC(分配失败)并且没有任务运行
- java - 如果 lastName 的第一个字符在 A 和 M 之间,我如何返回 1,如果 N 到 Z,我如何返回 2?
- php - 解码 vtt 时间戳数据
- drupal - composer install -n --ignore-platform-reqs 不忽略 PHP 扩展
- node.js - 在 Koa 中发送对象流作为响应
- hibernate - 数据库中唯一键的重复条目