使用java反射设置数组的值

baj*_*sko 4 java arrays reflection setvalue illegalargumentexception

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

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

例如.

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

    @JsonResponseParam(Name="friends")
    public FriendModel[] Friends;
}
Run Code Online (Sandbox Code Playgroud)

最后,UserModel应该填充好友.(JsonResponseParam是自定义anotation,Name值用作从json获取值的属性)

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

field.set(t, values.toArray());
Run Code Online (Sandbox Code Playgroud)

这是方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

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

感谢您的时间.

Pet*_*rey 7

toArray()只返回一个,Object[]因此无法将其分配给任何其他数组类型.

你想要的是什么

field.set(t, values.toArray(Array.newInstance(field.getType().getComponentType(), values.size()));
Run Code Online (Sandbox Code Playgroud)

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

请参见Array.newInstance