将未知原始类型数组转换为对象数组的Java方法

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。
有没有一种方法可以以通用的方式将这个原始数组转换为对象数组。
通用的意思是不需要知道或检查数组的类型。或者我应该循环遍历所有原始类型并单独处理它们。
我可以用两种方式做到这一点,我想以通用的方式做这件事的唯一原因是为了减少冗余代码。
提前致谢。
3个回答

13
你可以使用 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
它完美地运行了。我从未想过可以将对象作为数组访问。谢谢你。 - Andrew Cumming

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[] - Peter Lawrey
Object[] 已经有了答案。但是针对 int[]double[] 等类型的 Object[] 序列化问题的解决似乎有点过于繁琐。通用数组应该存储在一个 Object 中。我想建议不要过于强调这一点。如果需要 Object[] - 没问题。 - Joop Eggen

0

你还需要使用 getLength() 方法。 - Peter Lawrey
这将是我的下一步。这将允许我从数组中获取一个项目,但我仍然需要知道如何首先将其存储在适当的数组中。 - Andrew Cumming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接