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