Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用ApacheVelocity和自己的解释脚本语言_Java_Velocity_Interpreted Language - Fatal编程技术网

Java 使用ApacheVelocity和自己的解释脚本语言

Java 使用ApacheVelocity和自己的解释脚本语言,java,velocity,interpreted-language,Java,Velocity,Interpreted Language,在我的Java应用程序中,我使用了一种面向对象的解释脚本语言(使用ANTLR指定),并希望将其与Velocity一起使用 在我的语言中,对象由DataObject的实例表示,如下所示(简化): 据我所知,我可以通过以下任何方式访问velocity中的属性(位于DataObject.properties中): <span>$foo.getProperties().get('bar')</span> <span>$foo.getProperties()['bar'

在我的Java应用程序中,我使用了一种面向对象的解释脚本语言(使用ANTLR指定),并希望将其与Velocity一起使用

在我的语言中,对象由DataObject的实例表示,如下所示(简化):

据我所知,我可以通过以下任何方式访问velocity中的属性(位于DataObject.properties中):

<span>$foo.getProperties().get('bar')</span>
<span>$foo.getProperties()['bar']</span>
<span>$foo.getProperties().bar</span>
<span>$foo.properties.bar</span>
$foo.getProperties().get('bar'))
$foo.getProperties()['bar']
$foo.getProperties().bar
$foo.properties.bar

现在我要问的主要问题是:有没有办法改变这种行为,使$foo.bar不处理Java属性dataObject.bar,而是直接处理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);
    }
}
公共类数据对象{
受保护的地图属性;
公共映射getProperties(){
归还财产;
}
公共对象获取(字符串名称){
返回properties.get(name);
}
}

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

谢谢您的回答!不幸的是,我无法控制DataObject本身:-(。在Velocity上下文中注册之前,我可以将DataObject包装在另一个类中,该类将get(String name)委托给getProperty(String name);但这只是一个局部解决方案,因为许多属性反过来也是数据对象,所以构造$a.b.c不可能这样。您知道您提到的行为在Velocity中的何处定义吗?一个小的(本地)对核心库的自适应可能更适合我的需要您可能可以通过自定义Uberspect实现这一点;这些可以通过velocity.properties进行配置。您必须在google上搜索示例和说明,我现在没有时间。太棒了,感谢您的提示!我快速查看了它,它似乎完全涵盖了我的全部内容要求:-)。我会试试写我自己的
<span>$foo.getProperties().get('bar')</span>
<span>$foo.getProperties()['bar']</span>
<span>$foo.getProperties().bar</span>
<span>$foo.properties.bar</span>
public class DataObject {
    protected Map<String, Object> properties;

    public Map<String, DataEntity> getProperties() {
        return properties;
    }

    public Object get(String name) {
        return properties.get(name);
    }
}