当您使用私有内部类编译 Java 类时,由于某种原因,匿名类似乎与它一起自动合成。这个类足以重现它:
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
编译时,这会生成预期的SynthesizeAnonymous.class和SynthesizeAnonymous$InnerClass.class文件,但它也会生成一个奇怪的文件,该文件对应于已合成SynthesizeAnonymous$1.class的匿名子类。java.lang.Object如果你用 来查看反汇编javap,它的默认构造函数似乎InnerClass获得了这个匿名类型的隐藏参数,并null在调用时传递给它new InnerClass()。
为什么要创建这个类?即使InnerClass它不是静态的,它也会被创建,但如果InnerClass它不是私有的或没有创建任何实例,InnerClass则不会创建它。它是某种形式的访问控制吗?这是如何运作的?