从内部 class 访问它的私有构造函数时反射 returns 两个构造函数
Reflection returns two constructors when accessing it's private constructor from an inner class
public class Base {
private Base instance;
private Base() {
}
public static class BaseHelper {
Base instance = new Base();
}
}
在上面的示例中,我在基 class 中有一个无参数构造函数。现在我列出这个 class 的构造函数,如下所示:
Constructor<?>[] constructors = Base.class.getDeclaredConstructors();
System.out.println(constructors);
运行此代码时,我得到以下输出:
[private com.Base(), com.Base(com.Base)]
这告诉我有两个构造函数:
- 我声明的私有构造函数
- 一个public默认构造函数
这是为什么?
编译器创建了两个构造函数,因为您的 BaseHelper
class 访问了您的 Base
class.
的私有构造函数
编译时,内部 class 是包含 class 的 "extracted"。如果 class BaseHelper
在 Base
class 之外,它就无法访问私有构造函数——这就是编译器创建合成构造函数的原因。这是您看到的第二个构造函数。
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());
}
}
}
public class Base {
private Base instance;
private Base() {
}
public static class BaseHelper {
Base instance = new Base();
}
}
在上面的示例中,我在基 class 中有一个无参数构造函数。现在我列出这个 class 的构造函数,如下所示:
Constructor<?>[] constructors = Base.class.getDeclaredConstructors();
System.out.println(constructors);
运行此代码时,我得到以下输出:
[private com.Base(), com.Base(com.Base)]
这告诉我有两个构造函数:
- 我声明的私有构造函数
- 一个public默认构造函数
这是为什么?
编译器创建了两个构造函数,因为您的 BaseHelper
class 访问了您的 Base
class.
编译时,内部 class 是包含 class 的 "extracted"。如果 class BaseHelper
在 Base
class 之外,它就无法访问私有构造函数——这就是编译器创建合成构造函数的原因。这是您看到的第二个构造函数。
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());
}
}
}