运行此操作时:
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文件时,两个类都有一个默认构造函数。
引擎盖下到底发生了什么?我错过了什么?
1条答案
按热度按时间pcrecxhr1#
getConstructors
:返回一个数组,该数组包含反映该类对象所表示的类的所有公共构造函数的构造函数对象。
构造
TestB
不公开!根据jls§8.8.9:如果类不包含构造函数声明,则隐式声明默认构造函数。顶级类、成员类或本地类的默认构造函数的形式如下所示:
默认构造函数与类具有相同的可访问性。
...
TestB
具有“包”访问级别(无访问修饰符),因此默认构造函数也具有该访问级别。所以,,getConstructors
不将其包含在返回的数组中。事实证明,这与TestB
属于TestA
.如果你想得到它,使用
getDeclaredConstructors
.