getDeclaredConstructors()列出了2个构造函数,但只有一个

时间:2014-03-10 08:50:59

标签: java reflection constructor jls

鉴于这些代码很少:

import java.util.Arrays;

public class Sample {
    private final int test;

    private Sample(int test) {
        this.test = test;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(Hello.class.getDeclaredConstructors()));
    }

    public static class Hello {
        private final int i;

        private Hello(int i) {
            this.i = i;
        }

        public int getI() {
            return i;
        }

        public static class Builder {
            private int i;

            private Builder() {

            }

            public static Builder builder() {
                return new Builder();
            }

            public void add(int i) {
                this.i = i;
            }

            public Hello build() {
                return new Hello(i);
            }
        }
    }
}

我不明白显示的输出:

[private Sample$Hello(int), Sample$Hello(int,Sample$1)]

这里列出的第二个构造函数是什么,第二个参数是Builder。我认为输出只显示Hello的私有构造函数,而不是第二个。

1 个答案:

答案 0 :(得分:4)

BuilderHello的静态嵌套类,因此它应该能够访问private构造函数Sample$Hello(int)

但是,JVM对嵌套类没有任何特殊支持,因此,从JVM的角度来看,Builder无法访问Sample$Hello(int)

为了解决这个问题,编译器生成具有默认可见性的合成构造函数Sample$Hello(int,Sample$1),并从Sample$Hello(int)调用它而不是Builder

Sample$1是由编译器生成的空类,用于为Sample$Hello(int,Sample$1)创建区分签名。实际上,这个构造函数的第二个参数始终是null