我一直在尝试创建自己的库,使用反射将基本类型从类序列化和反序列化为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数组。
以通用方式表示无需知道或检查数组类型是什么。或者我应该循环遍历所有原始类型并分别处理所有这些类型。
我可以通过两种方式做到这一点,我想以通用方式执行此操作的唯一原因是减少冗余代码。
提前致谢。
答案 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
)中保存(原始)数组似乎更合适。