当您使用私有内部类编译 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
则不会创建它。它是某种形式的访问控制吗?这是如何运作的?