首页 > 解决方案 > 为什么子类的默认构造函数不能通过反射获得?

问题描述

运行时:

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 文件时,两个类都有一个默认构造函数。

引擎盖下发生了什么或我错过了什么?

标签: javareflectionconstructor

解决方案


getConstructors

返回一个包含 Constructor 对象的数组,该对象反映了此 Class 对象表示的类的所有公共构造函数。

的构造函数TestB是不公开的!根据JLS §8.8.9

如果类不包含构造函数声明,则隐式声明默认构造函数。顶级类、成员类或本地类的默认构造函数形式如下:

  • 默认构造函数与类具有相同的可访问性。
  • ...

TestB具有“包”访问级别(无访问修饰符),因此默认构造函数也具有该访问级别。因此,getConstructors不将其包含在其返回的数组中。事实证明,这与TestB成为TestA.

如果你想得到它,使用getDeclaredConstructors.


推荐阅读