gpt4 book ai didi

java - 如何使用反射设置原始数组字段?

转载 作者:太空宇宙 更新时间:2023-11-04 06:11:57 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,该函数将一个对象作为参数,并使用其类的反射从某些二进制文件中自动填充它。

我编写了一些看起来像这样的代码(简化):

for (Field f: obj.getClass().getDeclaredFields()) 
{
try
{
if (f.getType().isPrimitive())
{
Object value = getPrimitiveValue(f.getType());
f.set(obj, value);
}
else if (f.getType().isArray())
{
Class<?> compType = f.getType().getComponentType();
Vector<Object> container = new Vector<Object>();

for (int i = 0; i < SOME_ARRAY_SIZE; i++)
{
Object item = getPrimitiveValue(compType);
container.add(item);
}

Object[] arr = container.toArray();
f.set(obj, arr);
}
}
catch (Exception e)
{
//...
}
}

getPrimitiveType根据组件类型从静态字节缓冲区读取原始类型。

vector 容器已设置正确的值。例如,如果组件类型很短,它就会变成一个 short[] 数组。

但是,尝试将数组字段 f 的值设置为 arr 的调用 f.set(obj, arr) 会引发异常:

java.lang.IllegalArgumentException: Can not set [B field MyClass.myArrayField to [Ljava.lang.Object;

正确的做法是什么?

最佳答案

问题是 Vector.toArray() 返回一个 Object [] 类型的数组,即使它可能包含正确类型的对象 - 这不是同一件事,因此会出现 IllegalArgumentException。

此外,您永远不能在 Object [] 和原始类型数组之间进行转换。相反,您可以使用 java.lang.reflect.Array 中的实用函数,例如newInstance()、set(数组、索引、值)等

public class Test {

private static short[] horses;

public static void main(String[] args) throws Exception {
Field field = Test.class.getDeclaredField("horses");

Object array = Array.newInstance(field.getType().getComponentType(), 3);
Array.set(array, 0, (short)123);
Array.set(array, 1, (short)456);
Array.set(array, 2, (short)789);

field.set(new Test(), array);
}
}

关于java - 如何使用反射设置原始数组字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28594026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com