我正在使用反射进行映射。
通过反射,我可以知道类的每个Field
是否引用了“array”类型的属性,而且我也可以获得具有数组类型的Class。
现在,我想设置对象字段的值。现在,出于某种原因,我可以获取数据来填充对象字段,但它不是数组的形式。相反,是Collection<?>
。
为了便于可视化,我有一些类似的代码:
/** create a new T instance, with the data taken from something*/
<T> T convert(Class<T> cls, Object something) {
T obj = cls.newInstance();
for (Field field : cls.getFields()) {
if (field.getType().isArray()) {
Class<?> arrayType = field.getType().getComponentType();
Collection<?> collection = this.getData(arrayType, something);
Object array = CONVERT(collection);
field.set(obj, arrayData);
}
}
}
在一天结束时,我需要将Collection<?>
对象转换为(hypotetically)一个?[]
对象,其中“?”是非常正确的。
我知道有collData.toArray()
,但它构建了一个Object[]
,这是不相容的;我知道有collData.toArray(T[])
,但我不知道如何在这种情况下使用它。
答案 0 :(得分:2)
由于您已有组件类型,请使用Array.newInstance:
Object[] array = collection.toArray(
(Object[])Array.newInstance(arrayType, collection.size()));
field.set(obj, array);
答案 1 :(得分:1)
或者按照以下方式进行,这更容易理解。创建一个数组并将其作为参数提供给colleation.toArray
:
Object[] array = collection.toArray(new Object[collection.size()] );
field.set(obj, array);
答案 2 :(得分:0)
作为toArray()函数的集合,返回Collection填充的数组。 来自java doc:
String[] y = x.toArray(new String[0]);