it-swarm.com.de

Java Reflection holt alle privaten Felder

Ich frage mich, ob es eine Möglichkeit gibt, alle privaten Felder einer Klasse in Java und deren 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 vorher den Namen aller Felder zu kennen) holen und prüfen ihr Typ.

68
user2152361

Es ist möglich, alle Felder mit der Methode getDeclaredFields() von Class zu erhalten. Dann müssen Sie den Modifikator der einzelnen Felder ü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() keine geerbten Felder zurückgibt.

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

114
Cyrille Ka

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

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;
    }
}
13
Kevin Bowersox

Versuchen Sie FieldUtils von Apache commons-lang3:

FieldUtils.getAllFieldsList(Class<?> cls)
9

Verwenden von Java 8:

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

Überprüfen Sie, ob ein Feld privat ist

Sie können die Felder filtern mit Modifier.isPrivate :

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

für ein einzelnes Field Objekt, das true zurückgibt, wenn das Feld private ist


Sammle alle Felder einer Klasse

Um alle Felder zu sammeln verwenden Sie:

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 abrufen möchten, können Sie sich auf Apache Commons Lang Version 3.2+ verlassen, die 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));
    }
}
7
madx

Meinst du gerne

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