我正在尝试在我的 java 应用程序中使用 GroovyShell 来运行代码。该代码将用于测试,并在程序完成时导出到 java 文件。为了方便用户,我希望 groovy 的输入与将要执行的 java 代码尽可能相似。这意味着当用户尝试创建变量以避免私有(private)变量时,我将删除类型,即。
String str = "Lorem"
将被执行为
str = "Lorem".
但是我似乎无法解决的一件事是,用户通常只能调用方法 foo()
他们现在必须调用对象上的方法。
Java code {
foo();
}
Groovy code {
im = new InteractiveMode();
im.foo();
}
这当然是因为方法foo()
是在对象this
上调用的,在groovy代码中引用的是脚本而不是java对象。所以我的问题是:我能否以某种方式重写 groovy 中的 this 关键字或以其他方式允许在对象上调用方法而不必每次都指定哪个对象?
编辑:澄清
这就是我的代码现在的样子:
InteractiveMode test = new InteractiveMode();
GroovyShell gs = new GroovyShell();
gs.setVariable("im", test);
gs.evaluate("im.foo();");
我想用这个得到相同的输出:
InteractiveMode test = new InteractiveMode();
GroovyShell gs = new GroovyShell();
gs.setVariable("im", test);
//Some groovy magic
gs.evaluate("foo();");
最佳答案
听起来您想在创建 GroovyShell 时传入自定义的 CompilerConfiguration。然后您可以按照描述设置脚本基类in this post .
如果您只需要从脚本访问一些属性,您也可以考虑使用绑定(bind)。绑定(bind)只是属性名称到属性的映射。如果需要,您甚至可以将 Bindings 设置为闭包,然后像方法一样调用它。使用绑定(bind)在 this page 顶部附近进行了描述。
如果您不想在脚本之外保存状态,那么我会使用绑定(bind)。如果您需要在脚本之外保存状态(如汽车示例中所示),那么该文章中描述的基类就是您想要的。第三个选项,如果您需要访问共享应用程序状态,则只需在脚本运行之前在脚本上设置委托(delegate)即可。这显示在第一个链接的底部附近。
关于java - 覆盖 "this"- GroovyShell 中的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24606389/