gpt4 book ai didi

java - 如何在 Java 中从字符串动态创建 Groovy 闭包

转载 作者:搜寻专家 更新时间:2023-11-01 03:00:16 24 4
gpt4 key购买 nike

我想知道如何在运行时从 Java 应用程序中创建一个 Closure 对象,其中 Closure 的内容是事先不知道的。我找到了一个解决方案,但我怀疑它是否是最优的。

背景:我编写了一些解析领域特定语言的 Groovy 代码。解析代码被静态编译并包含在 Java 应用程序中。在解析器实现中,我有一些类充当 DSL 特定部分的委托(delegate)。这些类使用以下模式调用:

class DslDelegate {
private Configuration configuration

def section(@DelegatesTo(SectionDelegate) Closure cl) {
cl.delegate = new SectionDelegate(configuration)
cl.resolveStrategy = Closure.DELEGATE_FIRST
cl()
}
}

我希望直接从 Java 代码调用这样的方法。我能够创建一个新的 DslDelegate 对象,然后调用 section() 方法。但是,我需要创建并传递一个参数,该参数是 Closure 的一个实例。我希望从 String 对象初始化内容。

我的解决方案: 以下 Java 代码(实用程序)正在运行,但我要求改进。这当然可以以更清洁或更有效的方式完成吗?

/**
* Build a Groovy Closure dynamically
*
* @param strings
* an array of strings for the text of the Closure
* @return a Groovy Closure comprising the specified text from {@code strings}
* @throws IOException
*/
public Closure<?> buildClosure(String... strings) throws IOException {
Closure<?> closure = null;

// Create a method returning a closure
StringBuilder sb = new StringBuilder("def closure() { { script -> ");
sb.append(String.join("\n", strings));
sb.append(" } }");

// Create an anonymous class for the method
GroovyClassLoader loader = new GroovyClassLoader();
Class<?> groovyClass = loader.parseClass(sb.toString());

try {
// Create an instance of the class
GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance();

// Invoke the object's method and thus obtain the closure
closure = (Closure<?>) groovyObject.invokeMethod("closure", null);
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
} finally {
loader.close();
}

return closure;
}

最佳答案

您可以使用 GroovyShell 从字符串创建一个 Closure:

public Closure<?> buildClosure(String... strings) {
String scriptText = "{ script -> " + String.join("\n", strings) + " }";
return (Closure<?>) new GroovyShell().evaluate(scriptText);
}

关于java - 如何在 Java 中从字符串动态创建 Groovy 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36771508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com