Динамические поля и / или искусственные методы - PullRequest
0 голосов
/ 13 января 2012

Я работаю с динамической моделью Dataset, которая (вкратце) принимает атрибуты и сохраняет их в Map, как это ...

Dataset dataset = new Dataset();
dataset.setAttribute("name", "value");

... для последующего восстановления, вот так ...

String value = dataset.getAttribute("name");

... и это прекрасно сработало для моих целей. Но сейчас я нахожусь в месте, где я хотел бы использовать шаблонизатор для динамического генерирования HTML. В шаблоне для меня не идеально делать много ${dataset.getAttribute("name")}. Было бы неплохо, если бы я мог создавать искусственные методы всякий раз, когда что-то добавлялось к Dataset. Например, если бы я сделал это ...

dataset.setAttribute("name", "value");

... Я бы хотел получить его вот так ...

String name;
name = dataset.name;
//or
name = dataset.getName();

... но до сих пор я не смог осуществить это. Какой подход я мог бы использовать здесь? Это вообще выполнимо?

Редактировать:

Я понимаю, что Velocity предлагает Правила поиска свойств , чтобы попытаться разрешить dataset.name в dataset.get("name"), и это здорово, но мне нужно знать, как этого добиться в случае, если Velocity не цель также.

Ответы [ 4 ]

1 голос
/ 13 января 2012

См. http://velocity.apache.org/engine/releases/velocity-1.5/user-guide.html#propertylookuprules

Если ваш метод был назван get(String attribute), а не getAttribute(String attribute), вы можете использовать тот же синтаксис, что и для обычных свойств.Итак, либо проведите рефакторинг вашего класса, либо добавьте дополнительный метод get, который делает то же самое, что и getAttribute, либо преобразуйте ваш объект в Map, который имеет метод get.

0 голосов
/ 13 января 2012

Из того, что я видел, довольно часто для движков шаблонов для Java поддерживаются как

  • получатели / установщики вида getAttribute, так и
  • реализацияИнтерфейс карты

Прежде чем тратить слишком много времени на поиск более общего решения (при условии, что вышеописанное не будет поддерживаться, как в Velocity), вероятно, стоит взглянуть на другие движки, чтобыпосмотрим, не поддерживает ли кто-нибудь из них это.Если все ваши возможные цели делают, то вы, вероятно, хорошо полагаться на это.

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

0 голосов
/ 13 января 2012

В прошлом я генерировал POJO динамически с ASM Objectweb.Преимущество заключается в том, что базовые поля безопасны по типу и гораздо более эффективны (особенно для частных значений)

0 голосов
/ 13 января 2012

Вы можете использовать прокси Dynamic Spring с технологией AOP или CGLib. АОП можно использовать для описания геттеров следующим образом: execution(public * com.bla.YourClass.get*())")

...