如何在Java中从一个对象生成所有初始化变量的映射



我有一个很大的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;
}

相关内容

  • 没有找到相关文章

最新更新