2009-08-12 26 views
5

Cuando compila una clase Java con una clase interna privada, parece que una clase anónima se sintetiza automáticamente junto con ella por algún motivo. Esta clase es suficiente para reproducirlo:Clase interna privada sintetiza clase anónima inesperada

public class SynthesizeAnonymous { 
    public static void method() { 
     new InnerClass(); 
    } 

    private static class InnerClass {} 
} 

cuando se compila, esto genera los esperados y SynthesizeAnonymous.classSynthesizeAnonymous$InnerClass.class archivos, sino que también genera un archivo extraño SynthesizeAnonymous$1.class que corresponde a una subclase anónima de java.lang.Object que fue sintetizado. Si observa el desmontaje con javap, parece que el constructor predeterminado de InnerClass obtiene un parámetro oculto de este tipo anónimo, y que se le pasa null cuando se llama al new InnerClass().

¿Por qué se crea esta clase? Se crea incluso si InnerClass no es estático, pero no se crea si InnerClass no es privado o no se crea ninguna instancia de InnerClass. ¿Es alguna forma de control de acceso? ¿Cómo funciona?

Respuesta

5

Esta clase se creó con el fin de proporcionarle acceso al constructor privado.

Echa un vistazo a this question para más detalles.

Cuestiones relacionadas