【发布时间】:2013-12-03 17:40:25
【问题描述】:
我已经使用 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;
}
我怀疑字段和值之间的类类型不一致..
感谢您的宝贵时间。
【问题讨论】:
标签: java arrays reflection illegalargumentexception setvalue