Ich habe ein Java-Objekt 'ChildObj', das von 'ParentObj' erweitert wurde. Wenn es nun möglich ist, alle Attributnamen und -werte von ChildObj, einschließlich der geerbten Attribute, mithilfe des Java-Reflexionsmechanismus abzurufen?
Class.getFields gibt mir das Array öffentlicher Attribute und Class.getDeclaredFields gibt mir das Array aller Felder, aber keines von ihnen enthält die Liste der geerbten Felder.
Gibt es eine Möglichkeit, auch die geerbten Attribute abzurufen?
java
reflection
introspection
Veera
quelle
quelle
quelle
Wenn Sie sich stattdessen auf eine Bibliothek verlassen möchten, bietet Apache Commons Lang Version 3.2+ Folgendes
FieldUtils.getAllFieldsList
:quelle
Sie müssen anrufen:
Reverben der Vererbungshierarchie nach Bedarf.
quelle
Reflections-Bibliothek verwenden:
quelle
Die rekursiven Lösungen sind in Ordnung. Das einzige kleine Problem ist, dass sie eine Obermenge deklarierter und geerbter Mitglieder zurückgeben. Beachten Sie, dass die Methode getDeclaredFields () auch private Methoden zurückgibt. Wenn Sie also durch die gesamte Hierarchie der Oberklassen navigieren, werden alle in den Oberklassen deklarierten privaten Felder eingeschlossen, und diese werden nicht vererbt.
Ein einfacher Filter mit einem Modifier.isPublic || Das Prädikat Modifier.isProtected würde Folgendes bewirken:
quelle
Arbeitsversion der obigen Lösung "DidYouMeanThatTomHa ..."
quelle
Mit der spring util-Bibliothek können Sie überprüfen, ob ein bestimmtes Attribut in der Klasse vorhanden ist:
API-Dokument:
https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/util/ReflectionUtils.html
oder
API-Dokument:
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/ReflectionUtils.html
@Prost
quelle
Du kannst es versuchen:
quelle
Kürzer und mit weniger instanziiertem Objekt? ^^
quelle
getFields (): Ruft alle öffentlichen Felder in der gesamten Klassenhierarchie ab und
getDeclaredFields (): Ruft alle Felder ab, unabhängig von ihren Modifikatoren, jedoch nur für die aktuelle Klasse. Sie müssen also für alle beteiligten Hierarchien sorgen.
Ich habe diesen Code kürzlich von org.apache.commons.lang3.reflect.FieldUtils gesehen
quelle
quelle
Dies ist eine Umformulierung der akzeptierten Antwort von @ user1079877. Es kann sein, dass eine Version, die einen Parameter der Funktion nicht ändert und auch einige moderne Java-Funktionen verwendet.
Diese Implementierung macht den Aufruf auch etwas präziser:
quelle
Es gibt ein paar Macken, die von FieldUtils nicht angesprochen werden - insbesondere synthetische Felder (z. B. von JaCoCo injiziert) und auch die Tatsache, dass ein Aufzählungstyp natürlich ein Feld für jede Instanz hat, und wenn Sie ein Objektdiagramm durchlaufen, erhalten Sie Alle Felder und dann die Felder von jedem von ihnen usw. erhalten, dann werden Sie in eine Endlosschleife geraten, wenn Sie eine Aufzählung treffen. Eine erweiterte Lösung (und um ehrlich zu sein, ich bin sicher, dass dies irgendwo in einer Bibliothek leben muss!) Wäre:
Testklasse in Spock (und Groovy fügt synthetische Felder hinzu):
quelle