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

jun*_*sal 3 java reflection parsing 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

}
Run Code Online (Sandbox Code Playgroud)

这个对象包含很多对象,其中的对象有很多子对象,并且继承了这个对象.

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

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

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

ska*_*man 5

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


mor*_*rja 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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