2013-05-31 22 views
5

プリミティブ型をクラスからxmlに、xmlからクラスインスタンスにシリアライズおよびデシリアライズするための独自のライブラリを作成しようとしています。タイプ。Java変換不明なプリミティブ配列からオブジェクト配列へ

これまで私はすべての基本的なプリミティブ型でこれを行うことができましたが、同じプリミティブの配列をシリアライズすることに固執しました。我々はそれがされる1かわからないけれども、この方法が唯一のプリミティブ配列int[], double[], float[], char[]などを返します

method.invoke(clazz, (Object[])null); 

は、たとえば、私は、プリミティブの配列を取得するには、クラスのメソッドを呼び出します。

私は、このような

T t = (T)method.invoke(clazz, (Object[])null); 
T[] t = (T[])method.invoke(clazz, (Object[])null); 

としてジェネリックを使用して試してみました。しかし、それは私がオブジェクトにプリミティブ配列からキャストすることはできません。

Array.newInstance私たちがそのタイプを知らないと仮定して使用することはできません。

このプリミティブの配列を一般的な方法でObject配列に変換できる方法はありますか?

配列の種類が何であるかを知る必要がないかどうかを確認することなく、一般的な意味で使用します。または、私はすべてのプリミティブ型を循環させ、それらのすべてを別々に処理する必要があります。

私はこれを一般的なやり方でやりたい唯一の理由は、冗長コードを減らすことです。

ありがとうございます。

+0

+1大きな質問です! –

答えて

9

あなたは

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

それは完全に働いた。私は配列としてオブジェクトにアクセスできるとは考えていませんでした。ありがとうございました。 –

0

Arrayユーティリティクラスを使用することができますjava.lang.reflect.Array.get()は、あなたがやりたいのか?

+0

また、getLength() –

+0

が必要です。これは私の次のステップです。これは私が配列から項目を取得することができますが、私はまだ適切な配列に格納する方法を知る必要があります。 –

0
Object result = method.invoke(clazz, (Object[])null); 
Class<?> arrayKlazz = result.getClass(); 
if (arrayKlazz.isArray()) { 
    Class<?> klazz = result.getComponentType(); 
    if (klazz == int.class) { 
     int[] intArray = arrayKlazz.cast(result); 
    } 
} 

そのオブジェクト(上記result)に(プリミティブ)のアレイを保持するために、よりappropiate思われます。

+0

これは、結果から 'Object []'をどのように得るのに役立ちますか? –

+0

'Object []'は既に回答済みです。しかし、 'int []'、 'double []'などの 'Object []'を使って直列化の問題を解決することは、あまりにも遠すぎるようです。 **一般的な配列はオブジェクト**内に保持する必要があります。私はあまり重視しないでそれを提案したい。 'Object []'が欲しい場合は - 細かいこと。 –

関連する問題