虽然这不是标准做法,但我很好奇是否可以将方法注入GroovyShell
编译上下文。
这个想法是有类似的东西(在Java中):
GroovyShell shell = new GroovyShell();
Script script = shell.parse("test()");
script.run();
Run Code Online (Sandbox Code Playgroud)
我想动态添加可调用的方法的地方test()
,已列出。
我已经尝试了一下用的捣乱Script
metaClass
,但我不明白的方式来实际操作metaClass
从Java。特别是,调用script.getMetaClass().getMethods().add(...)
会引发 UnsupportedOperationException。
本质上,我想定义调用 Java 方法而不是基于 Groovy 方法的 DSL 调用点。我愿意用 Groovy 编写这部分(并且我知道如何做到这一点),但我真的很好奇这是否是一种可行的替代方法,或者如果不是,陷阱是什么。
简而言之:如何动态定义一个GroovyShell
知道的方法?
对此有两个非常简单的解决方案:a) 典型的“脚本”方法 b) 更时髦的方法
a) 只是在您的脚本字符串前面加上一个定义您的方法的字符串。b) 将引用放入绑定中,例如在名称“test”下。该引用的值是一个闭包对象或任何其他具有“call(args)”方法的对象。当执行脚本时,Groovy 看到“test()”,它会首先尝试找到这样的方法,如果没有这样的方法,它会尝试将“test”解析为一个属性,并将在绑定中找到它。然后它将使用提供的参数(如果有)调用如此解析的引用(闭包)。
还有更多高级选项,例如提供 CompilerConfiguration,这些选项都列在“Groovy in Action, 2nd edition”(无耻插件)的 DSL 章节中。