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;
}
}
FieldUtils
apache 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
'IT TIP' 카테고리의 다른 글
마우스 오버시 캔버스에서 픽셀 색상 가져 오기 (0) | 2020.10.31 |
---|---|
배경 크기를 조정하지 않고 Android 버튼의 히트 영역을 늘리는 방법은 무엇입니까? (0) | 2020.10.31 |
선택 쿼리에서 자동 증가 필드를 생성하는 방법 (0) | 2020.10.31 |
Unix / Linux 플랫폼에서 OS 이름과 버전을 찾는 가장 좋은 방법 (0) | 2020.10.31 |
스트림의 마지막 요소를 가져 오는 가장 효율적인 방법 (0) | 2020.10.31 |