gpt4 book ai didi

java - 使用java反射设置数组的值

转载 作者:搜寻专家 更新时间:2023-11-01 01:35:00 24 4
gpt4 key购买 nike

我已经使用 java 反射创建了通用的 json 解析器,但是有一个我无法解决的错误。

方法(在这个问题的底部)接收我的自定义模型类的子类。我遍历字段并从 json 设置值。如果子类包含某个其他类(又是模型的子类)的数组属性,我创建了小递归来填充这些对象。

例如。

class UserModel extends Model
{
@JsonResponseParam(Name="userName")
public String Name;

@JsonResponseParam(Name="friends")
public FriendModel[] Friends;
}

最后 UserModel 应该填入 Friends。 (JsonResponseParam为自定义注解,Name值作为属性从json取值)

此方法的结果是 IllegalArgumentException,它被抛出

field.set(t, values.toArray());

方法如下:

protected <T extends Model> T getModel(T t)
{
Field[] fields = t.getClass().getFields();

for (Field field : fields) {
Annotation an = field.getAnnotation(JsonResponseParam.class);

if(an != null){
try
{
if(field.getType() == boolean.class)
field.setBoolean(t, t.getBool(((JsonResponseParam)an).Name()));

if(field.getType() == String.class)
field.set(t, t.getString(((JsonResponseParam)an).Name()));

if(field.getType() == int.class)
field.setInt(t, t.getInt(((JsonResponseParam)an).Name()));

if(field.getType() == Date.class)
field.set(t, t.getDate(((JsonResponseParam)an).Name()));

if(field.getType().isArray()){

ArrayList<Model> modelArray = t.getModelArray(((JsonResponseParam)an).Name());
ArrayList<Model> values = new ArrayList<Model>();

for (Model model : modelArray) {

Class<? extends Model> arrayType = field.getType().getComponentType().asSubclass(Model.class);
Model m = arrayType.newInstance();
m.jsonObject = model.jsonObject;
model.getModel(m);
values.add(m);
}

field.set(t, values.toArray());
}

} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}

return t;
}

我怀疑字段和值之间的类类型不一致..

感谢您的宝贵时间。

最佳答案

toArray() 只返回一个 Object[],所以它不能被分配给任何其他数组类型。

你想要的是

field.set(t, values.toArray(Array.newInstance(field.getType().getComponentType(), values.size()));

这将创建一个与字段匹配的类型的数组。

参见 Array.newInstance

关于java - 使用java反射设置数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20083925/

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