IT TIP

Java 리플렉션은 모든 개인 필드를 가져옵니다.

itqueen 2020. 10. 31. 10:22
반응형

Java 리플렉션은 모든 개인 필드를 가져옵니다.


Java 및 해당 유형의 일부 클래스의 모든 개인 필드를 얻는 방법이 있는지 궁금합니다.

예를 들어 내가 수업이 있다고 가정 해 봅시다.

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

지금은 모든 개인 필드 (좀하고 싶습니다 aaa, bbb, ccc클래스의)을 SomeClass(모든 필드의 선행의 이름을 모른 채)와 그 유형을 확인.


의 방법 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;
    }
}

FieldUtilsapache commons-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());

필드가 비공개인지 확인

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) If you don't want to reinvent the wheel and get all the fields of a class hierarchy you could rely upon Apache Commons Lang version 3.2+ which provides 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));
    }
}

Do you mean like

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

참고URL : https://stackoverflow.com/questions/15315368/java-reflection-get-all-private-fields

반응형