Java: Alle Variablennamen in einer Klasse abrufen

91

Ich habe eine Klasse und möchte alle öffentlichen Felder (keine Methoden) finden. Wie kann ich das machen?

Vielen Dank!

ufk
quelle
Sie sollten dies mithilfe der Reflection-API tun können .
Crozin

Antworten:

133
Field[] fields = YourClassName.class.getFields();

Gibt ein Array aller öffentlichen Variablen der Klasse zurück.

getFields()Geben Sie die Felder in der gesamten Klassenerbschaft zurück. Wenn Sie möchten, dass die Felder nur in der betreffenden Klasse und nicht in ihren Oberklassen definiert werden, verwenden getDeclaredFields()und filtern Sie die Felder publicmit dem folgenden ModifierAnsatz:

Modifier.isPublic(field.getModifiers());

Das YourClassName.classLiteral repräsentiert tatsächlich ein Objekt vom Typ java.lang.Class. Weitere interessante Reflexionsmethoden finden Sie in den Dokumenten.

Die Fieldobige Klasse ist java.lang.reflect.Field. Sie können sich das gesamte java.lang.reflectPaket ansehen .

Bozho
quelle
2
nur eine Notiz - anfangs enthielt meine Antwort eine falsche Aussage, die jedoch mehrmals positiv bewertet wurde. Bitte lesen Sie genauer;)
Bozho
1
@downvoter - der Fehler war vorher. Wenn Sie jetzt eine sehen, teilen Sie diese bitte mit.
Bozho
Ist diese Lösung langsam? oder können wir es frei benutzen?
Dany Y
Es ist in Ordnung. Aber überbeanspruchen Sie es nicht.
Bozho
15

Sie können je nach Bedarf eine der beiden Optionen verwenden:

Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members.
Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.

Verwenden Sie den folgenden Code, um nur die öffentlichen Felder aus der obigen Liste (basierend auf den Anforderungen) zu filtern:

List<Field> fieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPublic(field.getModifiers())).collect(
    Collectors.toList());
Sahil Chhabra
quelle
2

Wie von wenigen Benutzern erwähnt, kann der folgende Code dazu beitragen, alle Felder in einer bestimmten Klasse zu finden.

TestClass testObject= new TestClass().getClass();
Method[] methods = testObject.getMethods();
for (Method method:methods)
{
    String name=method.getName();
    if(name.startsWith("get"))
    {
        System.out.println(name.substring(3));
    }else if(name.startsWith("is"))
    {
        System.out.println(name.substring(2));
    }
}

Ein interessanterer Ansatz ist jedoch unten:

Mit Hilfe der Jackson-Bibliothek konnte ich alle Klasseneigenschaften vom Typ String / integer / double und die entsprechenden Werte in einer Map-Klasse finden. ( ohne Reflexionen API zu verwenden! )

TestClass testObject = new TestClass();
com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper();

Map<String,Object> props = m.convertValue(testObject, Map.class);

for(Map.Entry<String, Object> entry : props.entrySet()){
    if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){
        System.out.println(entry.getKey() + "-->" + entry.getValue());
    }
}
Amit Kaneria
quelle