簡體   English   中英

使用反射來查找類成員值

[英]Using reflection to find class member value

我使用反射來查找類成員及其相關類型與以下代碼,但我的問題是,是否有辦法找到類默認值?
例如,在這種情況下,我需要值1L

public class SalesOrrP implements Serializable {
    private static final long serialUID = 1L;
}

我使用以下代碼來查找成員名稱和類型

Field[] declaredFields = clsObj.getClass().getDeclaredFields();
for (Field field : declaredFields) {
    // Get member name & types
    Class<?> fieldType = field.getType();
    Type genericType = field.getGenericType();
    String fieldTypeName = fieldType.getName();
    String memberName = field.getName();
    if (genericType instanceof ParameterizedType) {
        ParameterizedType pt = (ParameterizedType) genericType;
        for (Type typeOfReferance : pt.getActualTypeArguments()) {
            //...
        }
    }
}

如果您只需要訪問該字段的值,您只需要使其可訪問並獲取值:

field.setAccessible(true);
long value = field.getLong(null);

對於靜態字段,您不需要創建新實例。 在您的情況下, SalesOrrP.class.getDeclaredField("serialUID").get(null)應該足夠了。

對於非靜態字段,您無法獲得正在討論的初始化值 ,因為它在類的構造函數中由編譯器自動重定位。 這意味着您必須創建類的新實例才能獲得您正在尋找的值。

如果你確定這些類提供了一個無效的構造函數(即一個沒有參數的構造函數),那么你可以這樣做:

public static <T> Map<String, Object> getDefaultValues(Class<T> clazz, T instance) throws Exception {
    Map<String, Object> defaultValues = new HashMap<String, Object>();
    if (instance == null) {
        instance = clazz.newInstance();
    }
    for (Field field : clazz.getDeclaredFields()) {
        field.setAccessible(true);
        Object defaultValue = field.get(instance);
        defaultValues.put(field.getName(), defaultValue);
    }
    return defaultValues;
}

例如,在您的情況下, getDefaultValues(SalesOrrP.class, null)將返回{serialUID=1} 如果您已經有了類的實例,請將其作為第二個參數(而不是上面示例中的null )。

此最終值只能通過反射進行更改。 如果您知道無法使用反射,那么您就是安全的。

如果沒有,您可以創建一個新實例並獲取新實例的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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