【问题标题】:How to set a Field value as a plain Object via Reflection如何通过反射将字段值设置为普通对象
【发布时间】:2016-09-12 15:15:25
【问题描述】:

我有一个模型类:

public class Model {

@KeyDefinition("name")
private String mName;

@KeyDefinition("age")
private int mAge;

public Model(){

}

我有一个 List<Object>(Values) 和一个 List<String>(Keys),我通过 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;
}

因此,如果注释的值等于列表中的“键”项,则我在相应位置抓取对象并将字段的值设置为该值。

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

我可能做错了什么?

【问题讨论】:

  • 请发布创建 List 值和 List 键的主类。
  • 要设置int 值,您需要Integer,反射不会自动知道如何将String 转换为int 值。

标签: java reflection field


【解决方案1】:

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

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

抱歉,电话中缺少示例。

【讨论】:

  • 如何确定循环中的字段类型并相应地将对象转换为任何类型(您的方式)?
  • @Kanellis if field.gettype() == integer.class then set field as an int, or what.
猜你喜欢
  • 2019-04-22
  • 2019-07-05
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2011-06-25
  • 2023-04-05
相关资源
最近更新 更多