私有内部类合成意外的匿名类

时间:2009-08-12 17:23:50

标签: java private anonymous-class language-implementation

当您使用私有内部类编译Java类时,由于某种原因,似乎会自动合成匿名类。这个类足以重现它:

public class SynthesizeAnonymous {
    public static void method() {
        new InnerClass();
    }

    private static class InnerClass {}
}

编译时会生成预期的SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的SynthesizeAnonymous$1.class文件,该文件对应于合成的java.lang.Object的匿名子类。如果您使用javap查看反汇编,则显示InnerClass的默认构造函数会获得此匿名类型的隐藏参数,并且null会在new InnerClass()时传递给它被称为。

为什么要创建这个类?即使InnerClass不是静态的,也会创建它,但如果InnerClass不是私有的,或者没有创建InnerClass的实例,则不会创建它。它是某种形式的访问控制?这有什么作用?

1 个答案:

答案 0 :(得分:5)

创建此类是为了向您提供对私有构造函数的访问。

请查看this question了解详情。