6
votes

Existe-t-il un moyen d'obtenir la liste des classes intérieures à la réflexion en Java?

Y a-t-il un moyen de connaître les classes intérieures qu'une classe a traversé une réflexion en Java?


0 commentaires

3 Réponses :


10
votes

Oui, utilisez < Code> Classe # GetDeclaredClasses () pour cela. Il vous suffit de déterminer s'il s'agit d'une classe intérieure ou d'une classe (statique) imbriquée en vérifiant ses modificateurs. En supposant que parent est la classe mère, voici un exemple de kickoff: xxx

Remarque: cela ne couvre que les classes anonymes, mais voir Votre question précédente sur le sujet, je ne pense pas que vous soyez les demandes explicitement.


0 commentaires

1
votes

Non, malheureusement, pour la même raison pour laquelle vous ne pouvez pas énumérer des cours réguliers dans un paquet.

Les classes intérieures ne sont vraiment que des classes ordinaires au moment de l'exécution. Le compilateur fait quelque forme que ce soit pour contourner les règles d'accès habituels, par exemple, la classe interne semble pouvoir accéder à des champs privés et des méthodes de la classe jointe - elle peut le faire car le compilateur crée une fonction d'accesseur non privée qui est utilisé par la classe interne. Voir Java en un mot - Comment les classes internes fonctionnent pour plus de détails .

Les classes intérieures sont des cours réguliers, ce qui ne peut pas être énuméré de manière fiable, la réponse générale n'est donc pas possible.

Cependant, il peut être résolu dans des cas spécifiques. Si vous connaissez les bocaux que vous utilisez, vous pouvez également parcourir tous les fichiers du pot, à la recherche de fichiers du modèle yourpakage.yourclass $ .Class < / code> est un ou plusieurs caractères.

EDIT: Il existe différents types de classe intérieure:

  1. Les membres déclarés, tels que des interfaces et des classes
  2. cours anonymes et classes locales

    Si vous ne vous souciez que du premier cas, la réponse de Baluscs utilisant getdeclaredclasses est la bonne. Si vous voulez tous les classes intérieures , alors getdeclaredclasses malheureusement ne fonctionnera pas. Voir Bogue SDN 4191731 . Dans ce cas, vous pouvez essayer l'une des méthodes d'énumération de la classe proposées dans le lien (telles que la numérisation du fichier JAR.)


2 commentaires

Je pense que vous êtes confondu avec des "classes anonymes".


@Balusc bien, les classes techniquement anonymes sont des classes intérieures. :)



0
votes

Oui, il y a un tour pour le faire. Voir un ancien message sur Ressources de localisation . Connaissant votre classe (disons com.domain.api.classa), extrayez le nom du package, convertissez le package en chemin (remplacer ». 'Avec' / 'et vous obtenez COM / Domain / API) Scan pour tous les fichiers avec Extension .Class Dans ce dossier et conserver uniquement les fichiers qui commencent par votre nom de classe (Classa $ XXXXX), ce sont les classes intérieures pour la classe CLASSA


0 commentaires