我可以从 Java 动态地向 Groovy 基本脚本添加方法吗?

Mar*_*iot 4 dsl groovy

虽然这不是标准做法,但我很好奇是否可以将方法注入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知道的方法?

Die*_*erk 6

对此有两个非常简单的解决方案:a) 典型的“脚本”方法 b) 更时髦的方法

a) 只是在您的脚本字符串前面加上一个定义您的方法的字符串。b) 将引用放入绑定中,例如在名称“test”下。该引用的值是一个闭包对象或任何其他具有“call(args)”方法的对象。当执行脚本时,Groovy 看到“test()”,它会首先尝试找到这样的方法,如果没有这样的方法,它会尝试将“test”解析为一个属性,并将在绑定中找到它。然后它将使用提供的参数(如果有)调用如此解析的引用(闭包)。

还有更多高级选项,例如提供 CompilerConfiguration,这些选项都列在“Groovy in Action, 2nd edition”(无耻插件)的 DSL 章节中。