2012-11-08 7 views
2

새로운 것을 반성하고 객체를 가져 와서 String, String[] 또는 List<String> 인 모든 필드를 구문 분석하는 일반화 된 함수를 작성하려고합니다. 중첩 된 객체에 존재하는 상관 String, String[] 또는 List<String>는 해석되어야한다. 거기에 도움이 될 수있는 유틸리티가 있습니까? 부모 개체 (User)의 값을 얻기 간단했다 - BeanUtils.describe(user);를 사용 - 그것은 부모 개체의 String 값을 제공하지만 String[], List<String> 중첩 된 객체입니다. 이 기능이 필요한 사람이 처음이 아닐 수도 있습니다. 이 일을 성취하는데 도움이되는 유틸리티 나 코드가 있습니까?자바 리플렉션 - 오브젝트 내의 중첩 된 오브젝트,리스트 및 배열의 ​​값을 얻는다.

public class User { 
    private String somevalue; 
    private String[] thisArray; 
    private List<String> thisList; 
    private UserDefinedObject myObject; 
    . 
    . 
    . 

} 
+1

"이 기능이 필요한 사람이 처음이 아닐 수도 있습니까?" ... 그리고 난 당신이 ** 정말 **이 기능이 필요하면 요청하는 최초의 사람이 아니에요 확신 해요. '사람들은 반영을 사용하여 비 반영적으로해야하는 일들을 그렇게 자주합니다. –

답변

2

방법 Class.getDeclaredFields는 당신에게 클래스의 각 분야를 대표하는 Field의 배열을 얻을 것이다. 이러한 이상 루프를 할 수 있었던 Field.getType에 의해 반환 유형을 선택합니다. 유형의 필드를 List<String>List이 까다 롭습니다 필터링 - 그와 도움을 this post을 참조하십시오.

원하는 필드를 처음으로 동적으로 조회 한 후에는 성능 향상을 위해 관련 Field 개 개체를 추적 (메모)해야합니다. 내가 참조 평등 (==)를 사용

//for each field declared in User, 
for (Field field : User.class.getDeclaredFields()) { 
    //get the static type of the field 
    Class<?> fieldType = field.getType(); 
    //if it's String, 
    if (fieldType == String.class) { 
     // save/use field 
    } 
    //if it's String[], 
    else if (fieldType == String[].class) { 
     // save/use field 
    } 
    //if it's List or a subtype of List, 
    else if (List.class.isAssignableFrom(fieldType)) { 
     //get the type as generic 
     ParameterizedType fieldGenericType = 
       (ParameterizedType)field.getGenericType(); 
     //get it's first type parameter 
     Class<?> fieldTypeParameterType = 
       (Class<?>)fieldGenericType.getActualTypeArguments()[0]; 
     //if the type parameter is String, 
     if (fieldTypeParameterType == String.class) { 
      // save/use field 
     } 
    } 
} 

주 대신 isAssignableFromString.classString[].class 이후 Stringfinal입니다 일치 :

여기에 빠른 예입니다.

편집 : 그냥 UserDefinedObject 중첩을 찾는 것에 대해 알아 챘습니다. 위의 전략을 재귀를 통해 검색 할 수 있습니다.

관련 문제