0

在我的 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 就像我在自己的脚本语言中一样?

4

1 回答 1

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);
    }
}

如果 Velocity 找不到 getBar() 或 getbar() 方法,它会自动在 $foo 中查找 get('bar')。

于 2012-06-28T15:24:07.317 回答