web-dev-qa-db-ja.com

Java reflectionはすべてのプライベートフィールドを取得します

Javaとそのタイプのあるクラスのすべてのプライベートフィールドを取得する方法があるのだろうか。

たとえば、クラスがあるとします

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

次に、クラスaaaのすべてのプライベートフィールド(bbbcccSomeClass)を取得します(すべてのフィールドの名前を事前に知らないで)。彼らのタイプ。

68
user2152361

ClassgetDeclaredFields()メソッドですべてのフィールドを取得することができます。次に、各フィールドの修飾子をチェックして、プライベートフィールドを見つける必要があります。

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

getDeclaredFields()は継承フィールドを返さないことに注意してください。

最終的に、メソッド Field.getType() を使用してフィールドのタイプを取得します。

114
Cyrille Ka

Modifierを使用して、フィールドがプライベートかどうかを判断できます。必ずgetDeclaredFieldsメソッドを使用して、クラスからプライベートフィールドを取得するようにしてください。getFieldsを呼び出すと、パブリックフィールドのみが返されます。

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

Apache commons-lang3の FieldUtils を試してください。

FieldUtils.getAllFieldsList(Class<?> cls)
9

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

フィールドがプライベートかどうかを確認します

フィールドのフィルタリング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())

フィールドがFieldの場合、trueを返す単一のprivateオブジェクト


クラスのすべてのフィールドを収集する

すべてのフィールドを収集を使用するには:

1)クラス階層から取得したフィールドを使用せずに、クラスのフィールドのみが必要な場合は、単に使用できます。

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

2)車輪を再発明してクラス階層のすべてのフィールドを取得したくない場合は、 Apache Commons Lang バージョン3.2+ 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

どういう意味ですか

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