java - 从内部类访问它的私有(private)构造函数时,反射返回两个构造函数

标签 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)]

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

  • 我声明的私有(private)构造函数
  • 公共(public)默认构造函数

这是为什么?

最佳答案

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

编译时,内部类从包含类中“提取”出来。如果 BaseHelper 类在 Base 类之外,它就无法访问私有(private)构造函数 - 这就是编译器创建合成构造函数的原因。这是您看到的第二个构造函数。

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());
        }
    }
}

关于java - 从内部类访问它的私有(private)构造函数时,反射返回两个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27814656/

相关文章:

java - 将自定义翻译字符串添加到 liferay 主题

java - 如何使用 Apache POI 处理空行?

java - 使用反射创建任何类型的对象

c# - 检查类的实例是否用属性注释

c# - 如何获取特定进程中存在的所有实例?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

java - 将大型 Java 应用程序从 MyBatis 迁移到 ORM

java - 没有收到 Java 中短信网关发送的短信?

c# - 单元测试动态加载代码

c# - 使用反射动态覆盖 ToString()