Rufen Sie alle privaten Felder mithilfe von Reflektion ab

Lesezeit: 4 Minuten

Benutzeravatar von user2152361
Benutzer2152361

Ich frage mich, ob es eine Möglichkeit gibt, alle privaten Felder einer Klasse in Java und ihren Typ zu erhalten.

Nehmen wir zum Beispiel an, ich habe eine Klasse:

class SomeClass {
    private String aaa;
    private SomeOtherClass bbb;
    private double ccc;
}

Jetzt möchte ich alle privaten Felder (aaa, bbb, ccc) der Klasse SomeClass (Ohne die Namen aller Felder im Voraus zu kennen) und überprüfen Sie deren Typ.

  • @atk Niemand zwingt dich zu antworten; Aber für viele von uns, die auf diese Frage von Google stoßen, ist die beste Antwort eine weitaus prägnantere Erklärung als das Lesen langer Posts zum Nachdenken. Selbst die vielen Fragen wie diese tragen dazu bei, was SO heute ist.

    – Angad

    3. September 2015 um 8:07 Uhr


  • Siehe Wie lese ich ein privates Feld in Java?

    – Martin Schröder

    25. September 2015 um 9:23 Uhr

Benutzeravatar von Cyrille Ka
Kyrill Ka

Es ist möglich, alle Felder mit der Methode zu erhalten getDeclaredFields() von Class. Dann müssen Sie den Modifikator jedes Felds überprüfen, um die privaten zu finden:

List<Field> privateFields = new ArrayList<>();
Field[] allFields = SomeClass.class.getDeclaredFields();
for (Field field : allFields) {
    if (Modifier.isPrivate(field.getModifiers())) {
        privateFields.add(field);
    }
}

Beachten Sie, dass getDeclaredFields() gibt keine geerbten Felder zurück.

Schließlich erhalten Sie den Typ der Felder mit der Methode Field.getType().

  • Ich denke, die Tatsache, dass ich gegen eine kompilierte Klasse arbeite, macht es ziemlich unbequem, weil die zurückgegebenen Felder Namen wie haben m0, m1etc., und sind vom Typ java.lang.reflect.Method. Dies könnte daran liegen, dass ich versuche, Reflektion für eine Spring Bean zu verwenden, die an eine Schnittstelle gecastet wird.

    – zahlen

    10. Dezember 2020 um 19:41 Uhr

Benutzeravatar von Kevin Bowersox
Kevin Bowersox

Sie können verwenden Modifier um festzustellen, ob ein Feld privat ist. Verwenden Sie unbedingt die getDeclaredFields -Methode, um sicherzustellen, dass Sie private Felder aus der Klasse abrufen, aufrufen getFields gibt nur die öffentlichen Felder zurück.

public class SomeClass {

    private String aaa;
    private Date date;
    private double ccc;
    public int notPrivate;

    public static void main(String[] args) {
        List<Field> fields = getPrivateFields(SomeClass.class);
        for(Field field: fields){
            System.out.println(field.getName());
        }
    }

    public static List<Field> getPrivateFields(Class<?> theClass){
        List<Field> privateFields = new ArrayList<Field>();

        Field[] fields = theClass.getDeclaredFields();

        for(Field field:fields){
            if(Modifier.isPrivate(field.getModifiers())){
                privateFields.add(field);
            }
        }
        return privateFields;
    }
}

  • @AfzaalAhmadZeeshan, warum hast du meine Bearbeitung “clazz” in “class” geändert, wenn wir eindeutig die Variable “clazz” und nicht das Schlüsselwort “class” verwenden müssen?

    – Vallentin

    17. November 2013 um 19:05 Uhr

  • Es tut mir leid für diesen Fehler, ich dachte, dies sei ein Fehler, da dem Dokument oder dem Code nirgendwo eine Variable zugeordnet war! Verzeih mir das..

    – Afzaal Ahmad Zeeshan

    17. November 2013 um 19:25 Uhr

  • @AfzaalAhmadZeeshan es gab eine Variable, sie befindet sich in den Argumenten der Methode. Möchten Sie Ihre Änderung jedoch widerrufen, da ich sie nicht ändern kann.

    – Vallentin

    18. November 2013 um 3:47 Uhr


Versuchen FieldUtils von Apache commons-lang3:

FieldUtils.getAllFieldsList(Class<?> cls)

Verwendung von Java 8:

Field[] fields = String.class.getDeclaredFields();
List<Field> privateFieldList = Arrays.asList(fields).stream().filter(field -> Modifier.isPrivate(field.getModifiers())).collect(
        Collectors.toList());

Benutzeravatar von madx
madx

Überprüfen Sie, ob ein Feld privat ist

Sie könnten Filtern Sie die Felder verwenden Modifikator.istPrivat:

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
// ...
Field field = null;
// retrieve the field in some way
// ...
Modifier.isPrivate(field.getModifiers())

auf einer einzigen Field Objekt, das zurückkehrt true wenn das Feld ist private


Sammle alle Felder einer Klasse

Zu Sammle alle Felder verwenden:

1) Wenn Sie nur die Felder der Klasse ohne die Felder aus der Klassenhierarchie benötigen, können Sie einfach Folgendes verwenden:

Field[] fields = SomeClass.class.getDeclaredFields();

2) Wenn Sie das Rad nicht neu erfinden und alle Felder einer Klassenhierarchie erhalten möchten, auf die Sie sich verlassen können Apache Commons Lang Version 3.2+, die bietet FieldUtils.getAllFieldsList:

import java.lang.reflect.Field;
import java.util.AbstractCollection;
import java.util.AbstractList;
import java.util.AbstractSequentialList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import org.apache.commons.lang3.reflect.FieldUtils;
import org.junit.Assert;
import org.junit.Test;

public class FieldUtilsTest {

    @Test
    public void testGetAllFieldsList() {

        // Get all fields in this class and all of its parents
        final List<Field> allFields = FieldUtils.getAllFieldsList(LinkedList.class);

        // Get the fields form each individual class in the type's hierarchy
        final List<Field> allFieldsClass = Arrays.asList(LinkedList.class.getFields());
        final List<Field> allFieldsParent = Arrays.asList(AbstractSequentialList.class.getFields());
        final List<Field> allFieldsParentsParent = Arrays.asList(AbstractList.class.getFields());
        final List<Field> allFieldsParentsParentsParent = Arrays.asList(AbstractCollection.class.getFields());

        // Test that `getAllFieldsList` did truly get all of the fields of the the class and all its parents 
        Assert.assertTrue(allFields.containsAll(allFieldsClass));
        Assert.assertTrue(allFields.containsAll(allFieldsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParent));
        Assert.assertTrue(allFields.containsAll(allFieldsParentsParentsParent));
    }
}

Benutzeravatar von Peter Lawrey
Peter Lawrey

Meinst du wie

Field[] fields = SomeClass.class.getDeclaredFields();

1424770cookie-checkRufen Sie alle privaten Felder mithilfe von Reflektion ab

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy