我使用反射来查找类成员及其相关类型,使用以下代码, 但我的问题是,是否有办法找到班级默认值? 例如,在这种情况下,我需要值 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 :(得分: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)
此最终值只能通过反射进行更改。 如果您知道无法使用反射,那么您就是安全的。
如果没有,您可以创建一个新实例并获取新实例的值。