Проблема: я хотел бы иметь общий доступ в Java к любому свойству / полю в объекте Java, аналогично тому, как это делает динамический язык (например, Groovy, JavaScript). . В то время, когда я пишу этот водопроводный код, я не знаю, какой это тип объекта или какое будет имя свойства / поля. Но когда я воспользуюсь им, я буду знать имя свойства / поля.
Мое текущее решение: до сих пор я написал простой класс-оболочку, который использует java.beans.Introspector
для захвата свойств Bean / POJO и предоставления их как Map<String, Object>
. Это грубо, но работает в простых случаях.
У меня вопрос: какие еще существуют методы решения этой проблемы, помимо отражения / преобразования в карту?
Прежде чем я пойду слишком далеко по этому пути, я хотел бы знать, знает ли кто-нибудь, как я могу каннибализировать что-то из Rhino или, возможно, javax.script.*
, в котором есть хорошо продуманная реализация этой концепции. Или, возможно, совершенно другой подход, который я не рассматривал.
Изменить: да, я знаком с отражением (я считаю, что это то, что Introspector в любом случае использует под капотом). Мне просто было любопытно, есть ли другие хорошо продуманные решения.
Изменить 2: Похоже, что наиболее популярные ответы включают 1) отражение либо напрямую, либо через вспомогательные классы, и / или 2) сопоставление с интерфейсами, которые реализуют желаемые члены класса. Меня очень заинтриговал комментарий, в котором говорится об использовании Groovy. Поскольку в Groovy есть настоящая утиная типизация и это язык JVM, есть ли способ создать простой помощник в Groovy и вызвать его из Java? Это было бы действительно круто и, вероятно, более гибко и работало бы лучше.
Ответ: Я отметил ответ Майка как лучший, поскольку он представляет собой законченную концепцию, которая ближе всего подходит. Я, вероятно, не буду идти этим путем в данном конкретном случае, но это, безусловно, полезный подход. Любой, кто просматривает это, должен обязательно прочитать разговоры здесь, так как там также много полезной информации.
Спасибо!
javax.script.*
и заставить их работать. - person mckamey   schedule 02.12.2010