Рекурсивное чтение любого Java-объекта и извлечение сложных типов в хэш-карту - PullRequest
3 голосов
/ 14 декабря 2010

Мне нужно написать служебную программу, которая будет принимать пустой 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-рефлексии и прошел несколько уроков и примеров в сети.Не очень уверен в том, как поступить.Я полагаю, что это одно из часто встречающихся требований экспертов и профессионалов здесь.

Пожалуйста, помогите мне с отправной точкой в ​​этом.Если для этого есть какие-либо бинарные утилиты с открытым исходным кодом?если да, пожалуйста, дайте мне знать.

Ответы [ 2 ]

5 голосов
/ 14 декабря 2010

Что-то вроде этого должно сделать это:

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();
    }
}

это, конечно, объединяет все поля всех объектов в одну карту. Возможно, вам придется создать карту для каждого шага рекурсии, если вы хотите получить дочерние карты. Я могу дать вам этот код, если вам это нужно.

Нет возврата карты, потому что та, которая передана методу, заполнена.

4 голосов
/ 14 декабря 2010

Взгляните на Apache Commons BeanUtils .Это уже делает большой кусок того, что вам нужно, и может даже сделать все за один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...