Java 反射获取所有私有字段

2022-08-31 12:22:03

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

例如,假设我有一个类

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

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


答案 1

可以使用 的方法获取所有字段。然后,您必须检查每个字段的修饰符以查找私有字段:getDeclaredFields()Class

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() 方法获得字段的类型。


答案 2

您可以使用 来确定字段是否为私有字段。请务必使用该方法来确保从类中检索私有字段,调用将仅返回公共字段。ModifiergetDeclaredFieldsgetFields

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