在我的Java应用程序中,我正在使用面向对象的解释脚本语言(使用ANTLR指定),并希望将其与Velocity一起使用。
在我的语言中,一个对象由 DataObject 的一个实例表示,它看起来像这样(简化):
public class DataObject {
protected Map<String, Object> properties;
public Map<String, DataEntity> getProperties() {
return properties;
}
public Object getProperty(String name) {
return properties.get(name);
}
}
对象实例的属性$foo可以作为 $foo.bar 访问
现在让我们假设我已经把$foo放到我的VelocityContext中:
DataObject foo = new DataObject();
velocityContext.put("foo", foo);
据我所知,然后我可以通过以下任何一种方式快速访问属性(驻留在 DataObject.properties 中):
<span>$foo.getProperties().get('bar')</span>
<span>$foo.getProperties()['bar']</span>
<span>$foo.getProperties().bar</span>
<span>$foo.properties.bar</span>
现在回到我的主要问题:有没有办法改变行为,使 $foo.bar 不会 dataObject.bar 解决 Java 属性,而是直接处理 dataObject.properties.get("bar"),以便我可以在 Velociy 中使用 $foo.bar,就像我在自己的脚本语言中使用一样?
你不能教Velocity这个技巧。 但是你可以教 DataObject 这个技巧:
public class DataObject {
protected Map<String, Object> properties;
public Map<String, DataEntity> getProperties() {
return properties;
}
public Object get(String name) {
return properties.get(name);
}
}
如果 Velocity 找不到 getBar() 或 getbar() 方法,它将自动在$foo中查找 get('bar')。