在GroovyShell中覆盖"这个" -keyword

时间:2014-07-07 08:42:53

标签: java groovy

我正在尝试在我的java应用程序中使用GroovyShell来运行代码。代码将用于测试,并在程序完成后导出到java文件。为了方便用户,我希望groovy的输入尽可能与将要执行的java代码相似。这意味着,当用户尝试创建变量以避免私有变量时,我将删除类型。

    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();");

1 个答案:

答案 0 :(得分:2)

在创建GroovyShell时,听起来想要传递自定义的CompilerConfiguration。然后,您可以按照in this post所述设置脚本基类。

如果您需要的是可从脚本访问的某些属性,您还可以查看使用Binding。 Binding只是属性的属性名称映射。如果需要,您甚至可以将Bindings设置为闭包,然后将其称为方法。在this page

的顶部附近描述了使用绑定

如果您不想在脚本之外保留状态,那么我将使用绑定。如果您需要在脚本之外保持状态,如在汽车示例中那样,那么该帖子中描述的基类就是您想要的。如果您需要访问共享应用程序状态,第三个选项是在脚本运行之前简单地设置脚本。这显示在第一个链接的底部附近。