Java反射获取所有私有字段

时间:2013-03-09 20:09:41

标签: java reflection field private

我想知道有没有办法在java及其类型中获取某些类的所有私有字段。

例如,假设我有一个类

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

现在我想获取类aaa的所有私有字段(bbbcccSomeClass)(不知道所有字段的名称)并检查它们类型。

6 个答案:

答案 0 :(得分:109)

可以使用getDeclaredFields()的{​​{1}}方法获取所有字段。然后你必须检查每个字段的修饰符以找到私有字段:

Class

请注意,List<Field> privateFields = new ArrayList<>(); Field[] allFields = SomeClass.class.getDeclaredFields(); for (Field field : allFields) { if (Modifier.isPrivate(field.getModifiers())) { privateFields.add(field); } } 不会返回继承的字段。

最终,您会获得方法Field.getType()的字段类型。

答案 1 :(得分:12)

您可以使用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;
    }
}

答案 2 :(得分:8)

从apache commons-lang3:

尝试FieldUtils
FieldUtils.getAllFieldsList(Class<?> cls)

答案 3 :(得分:7)

检查字段是否为私有

您可以使用Modifier.isPrivate

过滤字段
Field

在单个true对象上,如果该字段为private则返回Field[] fields = SomeClass.class.getDeclaredFields();

收集班级的所有字段

收集所有字段使用:

1)如果您只需要该类的字段而没有从类层次结构中获取的字段,则可以使用:

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));
    }
}

2)如果你不想重新发明轮子并获得类层次结构的所有字段,你可以依赖Apache Commons Lang版本3.2+提供FieldUtils.getAllFieldsList

{{1}}

答案 4 :(得分:7)

使用Java 8:

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

答案 5 :(得分:4)

你的意思是

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