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

Joh*_*eek 6 java private language-implementation anonymous-class

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

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

    private static class InnerClass {}
}
Run Code Online (Sandbox Code Playgroud)

编译时,这会生成预期的SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的SynthesizeAnonymous$1.class文件,该文件对应java.lang.Object于合成的匿名子类.如果你看一下反汇编javap,看来默认的构造函数InnerClass获得了这个匿名类型的隐藏参数,并nullnew InnerClass()调用时传递给它.

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

Chs*_*y76 5

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

有关详细信息,请查看此问题.