在我的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不会解决Java属性dataObject.bar,而是直接解决dataObject.properties.get(“bar”),所以我可以像在我自己的脚本语言中一样使用Velociy中的$ foo.bar吗?
答案 0 :(得分:2)
你不能教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);
}
}
如果无法找到getBar()或getbar()方法,Velocity会自动在$ foo中查找get('bar')。