我使用反射来设置字段值,但当我试图将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个比较来补偿,所以你不需要额外的依赖项。