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()) {
            //...
        }
    }
}
4

3 回答 3

3

如果您只需要访问该字段的值,您只需使其可访问并获取该值:

field.setAccessible(true);
long value = field.getLong(null);
于 2013-02-13T13:14:21.953 回答
2

对于静态字段,您不需要创建新实例。在你的情况下,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上面的示例)。

于 2013-02-13T13:15:17.960 回答
-1

这个最终值只能通过反射来改变。如果您知道不能使用反射,那么您是安全的。

如果没有,您可以创建一个新实例并获取新实例的值。

于 2013-02-13T13:09:49.200 回答