Java将未知的原始数组转换为对象数组

时间:2013-05-31 21:25:20

标签: java xml generics serialization reflection

我一直在尝试创建自己的库,使用反射将基本类型从类序列化和反序列化为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

有没有办法可以将这个基元数组转换为以通用方式表示Object数组。

以通用方式表示无需知道或检查数组类型是什么。或者我应该循环遍历所有原始类型并分别处理所有这些类型。

我可以通过两种方式做到这一点,我想以通用方式执行此操作的唯一原因是减少冗余代码。

提前致谢。

3 个答案:

答案 0 :(得分:10)

您可以使用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;
}

答案 1 :(得分:0)

java.lang.reflect.Array.get()能做你想做的吗?

答案 2 :(得分: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)中保存(原始)数组似乎更合适。