Prywatna klasa wewnętrzna syntetyzuje nieoczekiwaną anonimową klasę
Kiedy kompilujesz klasę Java z prywatną klasą wewnętrzną, wydaje się, że anonimowa klasa jest automatycznie syntetyzowana wraz z nią z jakiegoś powodu. Ta klasa jest wystarczająca do jej odtworzenia:
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
Po skompilowaniu generuje oczekiwaneSynthesizeAnonymous.class
iSynthesizeAnonymous$InnerClass.class
pliki, ale generuje też dziwneSynthesizeAnonymous$1.class
plik, który odpowiada anonimowej podklasiejava.lang.Object
który został zsyntetyzowany. Jeśli spojrzysz na demontaż za pomocąjavap
, wydaje się domyślnym konstruktoremInnerClass
uzyskuje ukryty parametr tego anonimowego typu i tonull
jest przekazywane do niego, gdynew InnerClass()
jest nazywany.
Dlaczego ta klasa jest tworzona? Jest tworzony, nawet jeśliInnerClass
nie jest statyczny, ale nie jest tworzony, jeśliInnerClass
nie jest prywatny lub nie ma instancjiInnerClass
jest kiedykolwiek stworzony. Czy jest to jakaś forma kontroli dostępu? Jak to działa?