如何通过Reflection将Field值设置为普通对象

时间:2016-09-12 15:15:25

标签: java reflection field

我有一个模型类:

public class Model {

@KeyDefinition("name")
private String mName;

@KeyDefinition("age")
private int mAge;

public Model(){

}

我有一个List<Object>(值)&amp;我通过List<String>方法处理的map(密钥):

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;
}

因此,如果注释的值等于&#34; Key&#34;列表中的项目,然后我抓住对应位置的对象并将字段的值设置为该值。

但是,当我到达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)

我可能做错了什么?

1 个答案:

答案 0 :(得分:2)

错误很清楚。 Age是一个int,你试图通过反射为它分配一个Object。这是不安全的,因为Object可以是任何东西。您需要a)确定循环中的字段类型并相应地将对象转换为任何类型,或者b)给自己一个可以接受Object的setter,并通过setter而不是字段,或者c)创建年龄field是一个通用的Object,当然不是理想的。

您可以使用的另一个策略是将某个对象设置为任何转换器类,并将其指定为注释的参数,然后使用它进行转换。

对于手机上缺少示例感到抱歉。