簡體   English   中英

使用java反射設置數組的值

[英]Setting value of array using java reflection

我使用java反射創建了通用的json解析器,但是有一個我無法解決的錯誤。

方法(在這個問題的底部),接收我的自定義Model類的子類。 我遍歷字段並從json設置值。 如果子類包含某些其他類的數組屬性(同樣是Model的子類),我創建了小遞歸來填充這些對象。

例如。

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

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

最后,UserModel應該填充好友。 (JsonResponseParam是自定義anotation,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

基本上,模式如下:

// First, create the array
Object myArray = Array.newInstance(field.getType().getComponentType(), arraySize);

// Then, adding value to that array
for (int i = 0; i < arraySize; i++) {
    // value = ....
    Array.set(myArray, i, value);
}

// Finally, set value for that array field
set(data, fieldName, myArray);

set函數取自此stackoverflow問題

public static boolean set(Object object, String fieldName, Object fieldValue) {
    Class<?> clazz = object.getClass();
    while (clazz != null) {
        try {
            Field field = clazz.getDeclaredField(fieldName);
            field.setAccessible(true);
            field.set(object, fieldValue);
            return true;
        } catch (NoSuchFieldException e) {
            clazz = clazz.getSuperclass();
        } catch (Exception e) {
            throw new IllegalStateException(e);
        }
    }
    return false;
}

應用上面的代碼,我們有:

if(field.getType().isArray()){
    // ....
    int arraySize = modelArray.size();
    Object values = Array.newInstance(field.getType().getComponentType(), modelArray.size());
    for (int i = 0; i < arraySize; i++) {
        // ......
        Array.set(values, i, m);                     
    }

    field.set(t, values);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM