[英]Java reflection and 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);
}
}
任何線索我怎樣才能反思做自動裝箱?
對於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次補償,因此您不需要額外的依賴性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.