9

メソッドの命名パターンとメソッドの戻り値の型を調べるために、リフレクションを使用して、プリミティブ型をクラスから xml に、および xml からクラス インスタンスにシリアル化および逆シリアル化する独自のライブラリを作成しようとしています。

これまでのところ、すべての基本的なプリミティブ型でこれを行うことができましたが、同じプリミティブの配列をシリアル化することに行き詰まりました。

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

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

このメソッドはプリミティブ配列int[], double[], float[], char[]などしか返しませんが、どちらになるかはわかりません。

次のようなジェネリックを使用してみました

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

しかし、プリミティブ配列からオブジェクトにキャストすることはできません。

Array.newInstanceまた、型がわからないと仮定して使用することはできません。

このプリミティブの配列を一般的な方法でオブジェクト配列に変換できる方法はありますか。

一般的な意味で、配列の型を知ったり確認したりする必要はありません。または、すべてのプリミティブ型を循環して、すべてを個別に処理する必要があります。

これを両方の方法で行うことができます 一般的な方法でこれを行う唯一の理由は、冗長なコードを削減することです。

前もって感謝します。

4

3 に答える 3

12

Arrayユーティリティ クラスを使用できます

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;
}
于 2013-05-31T21:30:16.663 に答える
0

java.lang.reflect.Array.get()はあなた が望むことをしますか?

于 2013-05-31T21:30:41.100 に答える
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オブジェクト(上記)に(プリミティブ)配列を保持する方が適切なようです。

于 2013-05-31T21:32:38.673 に答える