[英]“Argument is not an array” exception when setting array value using Java reflection
[英]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()));
這將創建一個與該字段匹配的類型數組。
基本上,模式如下:
// 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.