2011-11-11 12 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

残念ながら、プリミティブな配列とオブジェクト配列は、祖先として共通の配列クラスを持っていません。したがって、アンパックするための唯一の選択肢はボクシングプリミティブ配列です。このメソッドを呼び出す前に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

関連する問題