2013-02-13 75 views
3

我使用反射來查找類成員及其相關類型,使用下面的代碼, 但我的問題是如果有一種方法可以找到類默認值?
例如,在這種情況下,我需要值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()) { 
      //... 
     } 
    } 
} 
+0

可能很明顯的答案,但:是否有可能該字段不保留其初始化值(即它已在初始化後更改過)? – assylias 2013-02-13 13:08:33

+1

也許你可以創建另一個類的實例並查看其中的值? – keuleJ 2013-02-13 13:09:16

+0

@assylias - 不知道你是什麼意思... – 2013-02-13 13:11:07

回答

2

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

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

如果你確定的類提供了一個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)。

+0

但我怎麼能得到的價值,林先生已經創建類的實例,並從我呼籲領域 – 2013-02-13 13:28:42

+0

@JeanTennie我編輯我的答案。 – sp00m 2013-02-13 13:39:56

-1

該最終值可以只反射而改變。 如果你知道反射不能使用,那麼你很安全。

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

+0

最終值可以通過反射 – assylias 2013-02-13 13:11:57

+0

來改變,在這種情況下,它的最後,但在其他情況下,成員可以有價值,我想確定它... – 2013-02-13 13:14:12

3

如果你需要的是訪問字段的值,你只需要其提供給用戶,並獲得價值:

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

嗨,但我不能使用它,因爲在這裏你假設該字段是長型但我需要一般的解決方案,以找到任何成員類型是否有值分配給它... – 2013-02-13 13:17:52

+0

也例如,如果成員是私人字符串myVlaue =「156」;我曾試圖使用\t \t \t \t \t \t Object object = field。得到(NULL); \t \t \t \t \t \t \t \t \t \t字符串字符串=對象。的toString();但它適用於第一個成員類型l,但如果我有字符串等我轉儲 – 2013-02-13 13:30:53

+0

@JeanTennie我不明白你的意思 - 如果你不知道字段的類型,你可以使用'field.get(空);'如你所說。如果你知道它是一個特定的類型,你可以將它轉換爲該類型:'SomeType s =(SomeType)field.get(null);'。 – assylias 2013-02-13 13:34:12