2009-08-12 7 views
5

Lorsque vous compilez une classe Java avec une classe interne privée, il apparaît qu'une classe anonyme est automatiquement synthétisée avec elle pour une raison quelconque. Cette classe est suffisante pour le reproduire:Une classe interne privée synthétise une classe anonyme inattendue

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

    private static class InnerClass {} 
} 

Lors de la compilation, cela génère les SynthesizeAnonymous.class attendus et SynthesizeAnonymous$InnerClass.class fichiers, mais il génère également un fichier SynthesizeAnonymous$1.class étrange qui correspond à une sous-classe anonyme de java.lang.Object qui a été synthétisé. Si vous regardez le désassemblage avec javap, il apparaît que le constructeur par défaut de InnerClass obtient un paramètre caché de ce type anonyme, et que null lui est passé lorsque le new InnerClass() est appelé.

Pourquoi cette classe est-elle créée? Il est créé même si InnerClass n'est pas statique, mais il n'est pas créé si InnerClass n'est pas privé ou si aucune instance de InnerClass n'a jamais été créée. Est-ce une forme de contrôle d'accès? Comment ça marche?

Répondre

5

Cette classe est créée afin de vous donner accès à un constructeur privé. Pour plus de détails, consultez this question.

Questions connexes