簡體   English   中英

Java反射和自動裝箱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM