使用反射来查找类成员值

时间:2013-02-13 13:05:36

标签: java reflection

我使用反射来查找类成员及其相关类型,使用以下代码, 但我的问题是,是否有办法找到班级默认值? 例如,在这种情况下,我需要值 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()) {
            //...
        }
    }
}

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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)。

答案 2 :(得分:-1)

此最终值只能通过反射进行更改。 如果您知道无法使用反射,那么您就是安全的。

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