Java反射和自动装箱



我使用反射来设置字段值,但当我试图将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);
    }
}

任何线索我如何使反射做自动装箱?

对于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)).

您需要手动检查该值是否可能是基本类型的包装器,并对所有基本类型进行特殊处理。听起来很痛苦,用@Danny建议的lib

简单地检查是否有一个(且只有一个)类是基元(class #isPrimitive())。如果是,请使用开关检查自动装箱。因为没有涉及到子类,所以您可以只编写一个助手方法,其中原语类放在第一位,另一个放在第二位。这样就只需要8个比较来补偿,所以你不需要额外的依赖项。

相关内容

  • 没有找到相关文章

最新更新