Podczas kompilowania klasy Java z prywatną klasą wewnętrzną wydaje się, że anonimowa klasa jest automatycznie syntetyzowana wraz z nią z jakiegoś powodu. Podklasa ta nie jest wystarczająca, aby go odtworzyć:Prywatna klasa wewnętrzna syntezuje nieoczekiwaną anonimową klasę
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
Kiedy skompilowany ta generuje oczekiwanych SynthesizeAnonymous.class
i SynthesizeAnonymous$InnerClass.class
pliki, ale także generuje dziwne SynthesizeAnonymous$1.class
plik odpowiadający anonimowego podklasy java.lang.Object
który został syntetyzowany. Jeśli spojrzysz na demontaż za pomocą javap
, domyślny konstruktor z InnerClass
uzyska ukryty parametr tego anonimowego typu, a null
zostanie mu przekazany po wywołaniu new InnerClass()
.
Dlaczego ta klasa jest utworzona? Został utworzony, nawet jeśli InnerClass
nie jest statyczny, ale nie jest tworzony, jeśli InnerClass
nie jest prywatny lub nie zostanie utworzone żadne wystąpienie InnerClass
. Czy jest to jakaś forma kontroli dostępu? Jak to działa?