将 Apache Velocity 与自己的解释脚本语言结合使用



在我的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')。

相关内容

  • 没有找到相关文章

最新更新