簡體   English   中英

Java反射獲取所有私有字段

[英]Java reflection get all private fields

我想知道有沒有辦法在java及其類型中獲取某些類的所有私有字段。

例如,假設我有一個班級

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

現在我想獲得SomeClass類的所有私有字段( aaabbbccc )(不知道所有字段的名稱)並檢查它們的類型。

也能夠獲得與方法的所有字段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()獲取字段的類型。

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

嘗試FieldUtils Apache的公地lang3:

FieldUtils.getAllFieldsList(Class<?> cls)

使用Java 8:

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

檢查Field是否為私有

您可以使用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對象上,如果該字段是private ,則返回true


收集班級的所有領域

收集所有字段使用:

1)如果只需要類的字段而沒有從類層次結構中獲取的字段,則可以使用:

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

2)如果您不想重新發明輪子並獲得類層次結構的所有字段,您可以依賴提供FieldUtils.getAllFieldsList Apache Commons Lang版本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));
    }
}

你的意思是

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM