Java 反射和自动装箱

bla*_*ise 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么线索我如何进行反射来进行自动装箱?

Nic*_*olt 5

对于一个int字段getType将返回int.class. 自从 Java 引入自动装箱之前就一直是这种情况,因此,正确的是,如果您保持向后兼容性,则在对象类型传递原始类型时 Class.isAssignableFrom(Class)返回。false

或者就像你的情况一样:

int.class.isAssignableFrom(int.class)
Run Code Online (Sandbox Code Playgroud)

将返回true,同时:

int.class.isAssignableFrom(Integer.class)
Run Code Online (Sandbox Code Playgroud)

会回来的false

快速修复它以编写一个方法,当提供对象类型时,检查该类型和基元或使用 Jakarta Commons 等库中的类(ClassUtils.isAssignable(Class, Class, boolean))。