Private innere Klasse synthetisiert unerwartete anonyme Klasse
Wenn Sie eine Java-Klasse mit einer privaten inneren Klasse kompilieren, wird aus irgendeinem Grund automatisch eine anonyme Klasse mitsynthetisiert. Diese Klasse reicht aus, um es zu reproduzieren:
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
Beim Kompilieren wird das erwartete Ergebnis generiertSynthesizeAnonymous.class
undSynthesizeAnonymous$InnerClass.class
Dateien, aber es erzeugt auch eine seltsameSynthesizeAnonymous$1.class
Datei, die einer anonymen Unterklasse von entsprichtjava.lang.Object
das wurde synthetisiert. Wenn Sie die Demontage mit ansehenjavap
, es scheint der Standardkonstruktor vonInnerClass
gewinnt einen versteckten Parameter dieses anonymen Typs und dasnull
wird an ihn übergeben, wenn dernew InnerClass()
wird genannt.
Warum wurde diese Klasse erstellt? Es ist geschaffen, auch wennInnerClass
ist nicht statisch, wird aber nicht erstellt, wennInnerClass
ist nicht privat oder keine Instanz vonInnerClass
wird jemals geschaffen. Ist es eine Form der Zugangskontrolle? Wie funktioniert das?