A classe interna privada sintetiza uma classe anônima inesperada
Quando você compila uma classe Java com uma classe interna privada, parece que uma classe anônima é automaticamente sintetizada junto com ela por algum motivo. Esta classe é suficiente para reproduzi-lo:
public class SynthesizeAnonymous {
public static void method() {
new InnerClass();
}
private static class InnerClass {}
}
Quando compilado, isso gera o esperadoSynthesizeAnonymous.class
eSynthesizeAnonymous$InnerClass.class
arquivos, mas também gera um estranhoSynthesizeAnonymous$1.class
arquivo que corresponde a uma subclasse anônima dejava.lang.Object
que foi sintetizado. Se você olhar para a desmontagem comjavap
, aparece o construtor padrão deInnerClass
ganha um parâmetro oculto deste tipo anônimo, e quenull
é passado para ele quando onew InnerClass()
é chamado.
Por que essa classe é criada? É criado mesmo seInnerClass
não é estático, mas não é criado seInnerClass
não é privado ou nenhuma instância deInnerClass
é sempre criado. É alguma forma de controle de acesso? Como isso funciona?