Java反射和自动装箱

时间:2014-03-20 15:36:27

标签: java reflection autoboxing

我使用反射来设置字段值,但是当我尝试将Short指定为short时,我得到错误,因为isAssignable()返回false。

private void setFieldValue(Object result, Field curField, Object value) throws NoSuchFieldException, IllegalAccessException {
    if (!curField.getType().isAssignableFrom(value.getClass())) {
        LOG.error("Can't set field value type mismatch: field class: " + curField.getType().getSimpleName() + ", value class: " + value.getClass().getSimpleName());
    } else {
        curField.set(result, value);
    }
}

任何线索如何进行反思以进行自动装箱?

3 个答案:

答案 0 :(得分:2)

对于int字段,getType将返回int.class。自从之前就是这种情况 拳击是引入Java的,所以,正确地说,如果你保持向后兼容性,Class.isAssignableFrom(Class)在对象类型传递基本类型时返回false

或者就像你的情况一样:

int.class.isAssignableFrom(int.class)

将返回true,而:

int.class.isAssignableFrom(Integer.class)

会返回false

快速修复它编写一个方法,当它与对象类型一起呈现时,检查该类型和原语,或者使用像Jakarta Commons(ClassUtils.isAssignable(Class, Class, boolean))这样的库中的类。

答案 1 :(得分:0)

您需要手动检查该值是否可能是基本类型的包装器,并为所有基元类型创建特殊情况。听起来很痛苦,使用像@Danny建议的lib。

答案 2 :(得分:0)

只需检查一个(且只有一个)类是否是一个原语(Class#isPrimitive())。如果是,请检查自动装箱使用开关。由于没有涉及子类,您可以编写一个辅助方法,其中基本类是第一个,另一个是第二个。通过这种方式进行补偿只需8次比较,因此您不需要额外的依赖。