J'ai une hiérarchie de classe comme SO: (=> signifie "est une sous-classe de") ou plus succinctement: p> Comment ferais-je cela avec une réflexion Java? Et comment puis-je la preuve future au cas où j'ajouterais quelque chose entre A & B ou B & C? P> P>
4 Réponses :
Field[] fields = getClass().getSuperclass().getDeclaredFields(); And then iterate those fields and get the ones you want.In case your hierarchy grows, you can transform the above to a recursive calls to getSuperclass() (while getSuperclass() != Object.class), thus collecting all fields of all superclasses.
Ok, juste pour m'assurer que je ne suis pas fou - ai-je complètement mal interprété sa question? Ou est-il en fait de savoir comment une classe mère trouverait une méthode sur une classe enfant? Parce que votre méthode fonctionnerait s'il posait des méthodes sur la classe mère, mais je lis qu'il demande au contraire.
@ APERKINS, cela devrait également fonctionner avec des méthodes de la classe enfant, car la classe GetClass () retournera la classe actuelle de l'objet au moment de l'exécution (a) le getPersclass () retournera ensuite la classe (B), mais ce n'est pas futur -preuve.
Oui, j'ai compris qu'après avoir pensé à cela. Il est trop tôt le matin et le crud hiver tue mon cerveau. Au moins, c'est mon excuse et je m'en colle. :) J'ai mis à jour ma réponse de manière appropriée. Merci pour la réponse.
Vous devez utiliser GetDeclaredfields () Code>
à plusieurs reprises sur chaque classe de la hiérarchie de l'héritage de la classe de votre objet (via getPersclass () code>
). p>
Cependant, ce que vous planifiez sonne comme une violation méchante du concept d'héritage. Le meilleur moyen de futurs épreuves serait d'éviter tout ce genre de chose. Ce que êtes em> vous essayez de faire cela que vous pensez nécessite de tels shenanigans de réflexion? P>
D'abord, j'ai été énervé. Ensuite, j'ai essayé d'expliquer quel était mon objectif, mais je ne pouvais pas sans discuter de tout le problème. Ensuite, je me suis plus énervé. Ensuite, alors que je pose mon fils dormir, j'ai vu que mon problème pourrait être résolu beaucoup plus proprement sans réfléchir en ayant la superbe classe crée les objets enfants et les stocker localement. Merci pour le coup de pied dans le pantalon.
Autant que je sache, il n'ya aucun moyen de connaître vos "classes d'enfants" dans Java de manière réfléchie. Une meilleure solution ne serait pas une meilleure solution pour créer une méthode abstraite sur celle b aurait à mettre en œuvre et d'appeler cela à la place?
getClass().getParentClass().getDeclaredFields()
Exemple de méthode récursive pour Java 8+
Juste je suis sûr que je comprends bien - vous voulez appeler une méthode sur une sous-classe d'un, non? I.e. B hérite d'un, et vous voulez un appel à une méthode sur B?
Eh bien, je souhaite spécifiquement que les champs d'accès dynamiquement définis sur B à partir d'une méthode définie dans A. Mais le type déclaré de la classe est C.
Je ne comprends pas ce que vous voulez à la preuve futurs, si la réflexion fait toujours référence à la même classe que B ?, est-elle connue au moment de la compilation? Comment discriminez-vous quelle classe de votre chaîne d'héritage est-elle si ce n'est pas sa position?
@Josefx qui était aussi ma confusion. C'est pourquoi j'ai suggéré une méthode abstraite si A a toujours besoin d'accès à ces données mais ne sait pas ce que c'est, et vous pouvez utiliser une nullObject pour des implémentations qui ne se soucient pas des données.