2011-11-11 3 views
7

개체 필드를 반영하여 얻은 배열의 압축을 풀려고합니다. 일반 필드의 값을 Object로 설정합니다. 그것이 내가 다음 내 unpackArray 방법의 내용리플렉션을 사용하여 배열 풀기

fields[i].setAccessible(true); 
     String key = fields[i].getName(); 
     Object value = fields[i].get(obj); 

     if (value.getClass().isArray()){ 
      unpackArray(value); 
     } 

를 배열 (상관없이 그 형태) 내 일반 객체를 캐스팅하고 추출 할 배열의 경우, 내가가 java.util하는 개체 값을 캐스팅 시도 .Arrays, java.reflect.Array 및 Array []하지만 매번 나를 보내지 않을 때마다.

개체를 제네릭 배열로 캐스팅 할 수있는 방법이 있습니까?

많은 감사 샘

답변

10

모든 배열의 유일한 부모 클래스는 객체입니다.

배열의 값을 Object[]으로 추출하려면 다음을 사용하십시오.

public static Object[] unpack(Object array) { 
    Object[] array2 = new Object[Array.getLength(array)]; 
    for(int i=0;i<array2.length;i++) 
     array2[i] = Array.get(array, i); 
    return array2; 
} 
+0

감사합니다 –

2

불행히도 기본 배열 및 객체 배열에는 조상으로 공통 배열 클래스가 없습니다. 따라서 포장 풀기 옵션은 boxing primitive arrays입니다. 이 메서드를 호출하기 전에 null 체크 및 isArray를 실행하면 (자), 몇개의 체크를 삭제할 수 있습니다.

public static Object[] unpack(final Object value) 
{ 
    if(value == null) return null; 
    if(value.getClass().isArray()) 
    { 
     if(value instanceof Object[]) 
     { 
      return (Object[])value; 
     } 
     else // box primitive arrays 
     { 
      final Object[] boxedArray = new Object[Array.getLength(value)]; 
      for(int index=0;index<boxedArray.length;index++) 
      { 
       boxedArray[index] = Array.get(value, index); // automatic boxing 
      } 
      return boxedArray; 
     } 
    } 
    else throw new IllegalArgumentException("Not an array"); 
} 

시험 : 정말이 훌륭하게 작동 http://ideone.com/iHQKY

관련 문제