我有一个模型类:
public class Model {
@KeyDefinition("name")
private String mName;
@KeyDefinition("age")
private int mAge;
public Model(){
}
我有一个List<Object>
(Values) &我通过map
方法处理的List<String>
(Keys):
public <T> T map(Class<T> cls){
T instance;
try {
instance = cls.newInstance();
for(Field field: cls.getDeclaredFields()){
if(field.isAnnotationPresent(KeyDefinition.class)){
KeyDefinition annotation = field.getAnnotation(KeyDefinition.class);
for(int i = 0; i < mKeys.size(); i++){
if(annotation.value().equals(mKeys.get(i))){
field.setAccessible(true);
field.set(instance, mValues.get(i));
}
}
}
}
} catch (InstantiationException | IllegalAccessException e) {
System.out.println(e.getMessage());
return null;
}
return instance;
}
因此,如果注释的值等于列表中的"Key"项,那么我在相应位置抓取对象并将字段的值设置为该值。
但是,当我到达mAge
字段时,我得到以下消息:
java.lang.IllegalArgumentException: Can not set int field Model.mAge to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
at sun.reflect.UnsafeIntegerFieldAccessorImpl.set(UnsafeIntegerFieldAccessorImpl.java:98)
我可能做错了什么?
这个错误很明显。Age是一个int,你试图通过反射给它赋值一个Object。它是不安全的,因为对象可以是任何东西。你要么需要a)确定循环中的字段类型并将对象转换为相应的类型,要么b)给自己一个可以接受对象的setter,并通过setter而不是字段,或者c)使年龄字段成为泛型对象,这当然不是理想的。
你可以使用的另一种策略是为任何转换器类创建一些对象,并将其指定为注释的参数,然后使用该对象进行转换。
很抱歉缺少例子,在电话上。