Язык навигации по дереву объектов в Java - PullRequest
9 голосов
/ 08 марта 2010

В системе, которую я сейчас разрабатываю, мне часто приходится перемещаться по дереву объектов и на основе его состояния и значений предпринимать действия. В обычной Java это приводит к утомительным циклам for, операторам и т. Д. ... Существуют ли альтернативные способы достижения навигации по дереву, подобные XPath для XML? Я знаю, что есть JXPath и OGNL, но знаете ли вы какие-либо другие библиотеки для этой цели? Знаете ли вы какие-либо библиотеки, которые генерируют байт-коды для определенных выражений навигации по дереву, чтобы сделать обработку такой же быстрой, как и в нативных форвах Java и ifs?

Ответы [ 3 ]

5 голосов
/ 08 марта 2010

Вы можете рассмотреть Jakarta Bean Utils

String street = (String) PropertyUtils.getProperty(user, "address.street");

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

Один из недостатков заключается в том, что Bean Utils ожидает, что перемещаемый вами график не содержит нулевых ссылок.

Приведенный ниже фрагмент кода выкинет NPE

Person person = new Person();
person.setAddress(null);

String street = (String) PropertyUtils.getProperty(person, "address.street");

Чтобы преодолеть это ограничение, моя команда реализовала класс, который создает экземпляры всех нулевых ссылок на график по требованию. Этот код основан на рефлексии и динамических прокси (CGLIB).

2 голосов
/ 08 марта 2010

Могу ли я спросить вас, почему вы не хотели бы OGNL / JXPath? Очевидно, что вы, возможно, провели свое исследование, чтобы сказать «нет», но я хотел бы знать, почему OGNL не решает задачу, для которой он предназначен.

Также в google-collection есть некоторые функторы (в дополнение к упомянутым выше коллекциям обыкновенных), на которые стоит обратить внимание.

1 голос
/ 08 марта 2010

Джакартские коллекции (http://commons.apache.org/collections/apidocs/) позволяют применять предикаты, функторы и т. Д. К членам коллекции. Это направление, которое вы ищете?

...