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?