反射是在使用嵌套类

时间:2018-01-22 05:32:07

标签: java

public class Singleton {

    private String name;

    private Singleton(String name) {
        this.setName(name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static Singleton getInstance() {
        return SingletonHelper.getInstance();
    }

    private static Singleton INSTANCE;

    private static class SingletonHelper {

        private static Singleton getInstance() {
            if (INSTANCE == null) {
                INSTANCE = new Singleton("Singleton");
            }
            return INSTANCE;
        }
    }
}

我在上面写了Singleton实现,然后用反射代码创建实例,下面是我试图调试的反射调用。

Constructor<?> constructor = Singleton.class.getDeclaredConstructors()[0];

当我在上面调试行时,我观察到反射保留了一个原始构造函数,并创建了另外一个构造函数,如下所示:

Singleton(java.lang.String,Singleton) 并抛出异常说“错误的参数数量”。

我无法理解为什么在构造同一个对象时将对象本身作为参数。

提前致谢。

1 个答案:

答案 0 :(得分:-1)

您遇到的问题是在您声明的构造函数数组中实际上有两个声明的构造函数。

        Constructor<?>[] declaredConstructors = Singleton.class.getDeclaredConstructors();
    for(Constructor<?> cons : declaredConstructors){
        System.out.println(cons.getParameterCount());
    }

上面的代码片段证明您有两个声明的构造函数。 [0]中的第一个具有args String和Singleton,因此在尝试创建对象时,必须执行以下操作。

    Singleton newInstance = (Singleton)constructor.newInstance("name", Singleton.getInstance());

第二个构造函数是您尝试实例化的构造函数,您必须拥有以下代码

        Constructor<?> constructor = Singleton.class.getDeclaredConstructors()[1];
    constructor.setAccessible(true);
    Singleton newInstance = (Singleton)constructor.newInstance("name");

否则,链接的答案会告诉您为什么生成另一个构造函数希望这会有所帮助。