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