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在 Object (上面)中保存(原始)数组似乎更合适。

于 2013-05-31T21:32:38.673 回答