Ich habe einen Weg gefunden, geerbte Mitglieder über zu erhalten class.getDeclaredFields();
und auf private Mitglieder über zuzugreifen. class.getFields()
Aber ich suche nach privaten geerbten Feldern. Wie kann ich das erreichen?
109
Antworten:
Dies sollte zeigen, wie es gelöst werden kann:
(Oder
Class.getDeclaredFields
für ein Array aller Felder.)Ausgabe:
quelle
getSuperclass()
bis Sie erreichen,null
wenn Sie höher gehen möchten.getDeclaredFields()[0]
odergetDeclaredField("i")
wiederholen Sie den[0]
Array-Zugriff nicht in den nächsten beiden Anweisungen?getDeclaredFields
. Die Antwort wurde aktualisiert.Der beste Ansatz hier ist die Verwendung des Besuchermusters. Finden Sie alle Felder in der Klasse und alle Superklassen und führen Sie eine Rückrufaktion für sie aus.
Implementierung
Spring hat eine nette Utility-Klasse
ReflectionUtils
, die genau das tut: Sie definiert eine Methode, um alle Felder aller Superklassen mit einem Rückruf zu durchlaufen:ReflectionUtils.doWithFields()
Dokumentation:
Beispielcode:
Ausgabe:
quelle
Das wird es tun:
Wenn Sie ein Tool zur Codeabdeckung wie EclEmma verwenden , müssen Sie darauf achten , dass jeder Ihrer Klassen ein verstecktes Feld hinzugefügt wird. Im Fall von EclEmma sind diese Felder als synthetisch markiert , und Sie können sie wie folgt herausfiltern:
quelle
(basierend auf dieser Antwort)
quelle
Tatsächlich verwende ich eine komplexe Hierarchie, so dass Ihre Lösung nicht vollständig ist. Ich muss einen rekursiven Aufruf durchführen, um alle privaten geerbten Felder abzurufen. Hier ist meine Lösung
quelle
Ich musste Unterstützung für geerbte Felder für Blaupausen in Model Citizen hinzufügen . Ich habe diese Methode abgeleitet, die etwas präziser ist, um Felder + geerbte Felder einer Klasse abzurufen.
quelle
quelle