VTL оценивает или определяет ссылку на объект

Я хотел бы создать макрос, который принимает строку в качестве параметра и оценивает ее как объект. Что-то типа:

#macro( valueTest $objRef)
  #define( $obj )#evaluate("$${objRef}")#end
  $obj.foo ## This would have to be translated to $obj.getFoo()
#end

К сожалению, переменная $obj не указывает на ссылку на объект, которую можно использовать для вызова методов. $obj — это строка, и $obj.foo не пытается выполнить getFoo.

Почему-то у меня такое ощущение, что такова природа оценки и невозможно сделать то, что я хочу.

причина, по которой я хочу сделать что-то подобное, заключается в том, что у нас довольно мало макросов, которые принимают как путь привязки команды, так и саму команду в качестве параметра, и я надеюсь, что последняя может быть получена из первой.


person Priit    schedule 12.10.2010    source источник


Ответы (1)


Unfortunately, Velocity does not have a mechanism to define functions which return object references.  Macros are really intended to be a shortcut to display text.

В подобных случаях обычно нужно создать «инструмент» на Java и поместить экземпляр в контекст. Инструмент — это обычный класс с методом, который возвращает то, что вы ищете.

e.g.

создайте объект с помощью метода «eval», затем поместите его в контекст как «referenceEvaluator».

#set($obj = $referenceEvaluator.eval($objRef))

Вы можете обнаружить, что ваш код стал яснее, если вы избегаете двойной оценки и просто вставляете объект в контекст с именем $obj, который делает то, что вы хотите. (тоже лучшая производительность).

person Will Glass    schedule 21.10.2010