当从内部类访问它的私有构造函数时,Reflection返回两个构造函数

时间:2015-01-07 07:46:03

标签: java reflection

public class Base {

    private Base instance;

    private Base() {
    }

    public static class BaseHelper {
        Base instance = new Base();
    }
}

在上面的例子中,我在基类中有一个无参构造函数。现在我列出这个类的构造函数:

Constructor<?>[] constructors = Base.class.getDeclaredConstructors();
System.out.println(constructors);

运行此代码时,我得到以下输出:

[private com.Base(), com.Base(com.Base)]

这告诉我有两个构造函数:

  • 我声明的私有构造函数
  • 公共默认构造函数

为什么会这样?

1 个答案:

答案 0 :(得分:8)

编译器创建两个构造函数,因为您的BaseHelper类访问Base类的私有构造函数。

编译时,内部类被提取&#34;来自包含类。如果类BaseHelperBase类之外,则它无法访问私有构造函数 - 这就是编译器创建合成构造函数的原因。这是你看到的第二个构造函数。

Synthetic is a field modifier本质上是指编译器生成的。

package de.test;

import java.lang.reflect.Constructor;

public class Base {

    private Base instance;

    private Base() {
    }

    public static class BaseHelper {
        Base instance = new Base();
    }

    public static void main(String[] args) {
        Constructor[] constructors = Base.class.getDeclaredConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor + " - synthetic? " + constructor.isSynthetic());
        }
    }
}