我试图在java应用程序中使用GroovyShell来执行代码的运行时。代码将用于测试,并将在程序完成后导出到java文件中。为了方便用户,我希望groovy的输入尽可能类似于将要执行的java代码。这意味着,除其他外,当用户试图创建变量以避免私有变量时,I将删除类型。
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();");发布于 2014-07-07 13:01:38
听起来,在创建CompilerConfiguration时,您需要传入自定义的GroovyShell。然后,您可以按照描述的在这个岗位上设置脚本基类。
如果只需要从脚本中访问一些属性,也可以查看使用绑定的情况。绑定只是属性名称到属性的映射。如果需要,甚至可以设置绑定到闭包,然后像方法一样调用它。在此页顶部附近描述了使用绑定
如果您不想在脚本之外保存状态,那么我将使用绑定。如果您需要在脚本之外保持状态,就像在car示例中一样,那么该post中描述的基类就是您想要的。如果您需要访问共享应用程序状态,则第三个选项是在脚本运行之前简单地设置委托。这是显示在第一个链接的底部附近。
https://stackoverflow.com/questions/24606389
复制相似问题