【问题标题】:Java Convert Unknown Primitive Array to Object ArrayJava 将未知原始数组转换为对象数组
【发布时间】:2013-05-31 21:25:20
【问题描述】:

我一直在尝试创建自己的库来序列化和反序列化从类到 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

有没有一种方法可以将这个基元数组转换为通用的对象数组。

以通用方式表示不需要知道或检查数组的类型。或者我应该循环遍历所有原始类型并分别处理它们。

这两种方式我都可以这样做,我想以通用方式这样做的唯一原因是减少冗余代码。

提前致谢。

【问题讨论】:

    标签: java xml generics serialization reflection


    【解决方案1】:

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

    【讨论】:

    • 效果很好。我从没想过我可以将对象作为数组访问。谢谢。
    【解决方案2】:

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

    【讨论】:

    • 你还需要getLength()
    • 这将是我的下一步。这将允许我从数组中获取一个项目,但我仍然需要首先知道如何将它存储在正确的数组中。
    【解决方案3】:
    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[]
    • Object[] 已经回答。但是用Object[] 解决int[]double[] 等的序列化问题似乎有点过头了。 一个通用数组应该保存在一个对象中。我想建议不要过分强调。如果需要 Object[] - 很好。
    猜你喜欢
    • 2023-03-31
    • 2020-12-19
    • 2010-10-08
    • 2011-08-02
    • 1970-01-01
    • 2021-05-03
    • 2018-12-04
    • 2021-06-16
    相关资源
    最近更新 更多