我有一个很大的java对象列表,这些对象都继承自一个共享对象,每个对象都包含许多字段成员(属性)。但是,并不是所有对象上的所有字段都能保证初始化。还有一些包含在超级类中的字段也应该包括在内。我希望创建一个映射,其中包含所有初始化的成员,成员的标识符作为键,以及它们的值和映射值。
这可能吗?我简要介绍了反射,它看起来很有前景,但我没有太多的经验。所有的值都是原始值类型,如果需要,可以存储在字符串中。
使用此
public void method method(Object obj) {
Map initializedFieldsMap = new HashMap();
for (Field field : obj.getClass().getDeclaredFields()) {
Boolean acessibleState = field.isAccessible();
field.setAccessible(true);
Object value;
try {
value = field.get(obj);
if (value != null) {
initializedFieldsMap.put(field.getName(), new WeakReference(value));
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
field.setAccessible(acessibleState);
}
return initializedFieldsMap;
}
它在这里使用了一个WeakReference,这样对象值就不会被"卡住"(但它仍然不理想),也不符合GC的资格,无法访问Map中的值(例如字符串)使用:
String xxx = (String)map.get("value").get();
结合我找到的答案:
public static Map<String, String> generatePropertiesMap(Object o)
{
Map<String, String> properties = new HashMap<String, String>();
for (Field field : getAllDeclaredFields(o)) {
Boolean acessibleState = field.isAccessible();
field.setAccessible(true);
Object value;
try {
value = field.get(o);
if (value != null) {
properties.put(field.getName(), value.toString());
}
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
field.setAccessible(acessibleState);
}
return properties;
}
private static List<Field> getAllDeclaredFields(Object o) {
List<Field> list = new ArrayList<Field>();
List<Field[]> fields = new ArrayList<Field[]>();
//work up from this class until Object
Class next = o.getClass();
while (true) {
Field[] f = next.getDeclaredFields();
fields.add(f);
next = next.getSuperclass();
if (next.equals(Object.class))
break;
}
for (Field[] f : fields) {
list.addAll(Arrays.asList(f));
}
return list;
}