递归读取任何java Object并将复杂类型提取到哈希映射中

时间:2010-12-14 16:39:09

标签: java parsing reflection object

我需要编写一个实用程序,它接受一个空白的HashMap和任何对象作为参数并返回HashMap

public HashMap returnMap(HashMap map,Object parseThisObject){

//logic to strip all children, children of children...... and place it in HashMap
//return map

}

此对象包含很多对象,其中的对象包含很多子对象,并且继承了这些对象。

我的实用程序必须足够通用,以递归方式读取所有子项,直到它到达每个对象中的基元,将每个对象放在hasp映射中并将其返回。 这就像父母会在地图中出现的那样。但是个别孩子也会在地图中作为后续条目出现。

我是java反射的新手,我在网上浏览了一些教程和示例。对如何进行不太自信。我相信这是专家和专业人士可能面临的经常要求之一。

请帮助我解决这个问题。如果有任何bean实用程序开源可用吗?如果是的话请告诉我。

2 个答案:

答案 0 :(得分:5)

这样的事情应该这样做:

public void fillMap(HashMap<String, Object> map, Object bean) {
    try {
        BeanInfo info = Introspector.getBeanInfo(bean.getClass());
        PropertyDescriptor[] props = info.getPropertyDescriptors();
        for (int i = 0; i < props.length; i++) {
            Method reader = props[i].getReadMethod();
            if (reader != null && !props[i].getName().equals("class")) {
                Object invoke = reader.invoke(bean, new Object[] {});
                if (invoke != null) {
                    if (!reader.getReturnType().isPrimitive()) {
                        fillMap(map, invoke);
                    } else {
                        map.put(props[i].getName(), invoke);
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

当然,这会将所有对象的所有字段放入一个地图中。如果您想要子项的子图,则可能必须为每个递归步骤创建一个映射。如果你需要,我也可以给你这些代码。

没有返回地图,因为传递给该方法的地图已被填充。

答案 1 :(得分:4)

看看Apache Commons BeanUtils。它已经完成了你需要的很大一部分,甚至可以一次性完成所有工作。