gpt4 book ai didi

java - Groovy DSL 与 Java

转载 作者:太空宇宙 更新时间:2023-11-04 06:22:01 26 4
gpt4 key购买 nike

自从我开始使用 Groovy 以来已经有几天了。但通过所有的阅读和冲浪,我还不太清楚如何实现我的想法。所以,作为一个初学者,请原谅我。一如既往,我们将非常感谢您的帮助。

我想要实现的是这样的:我有一个 Java 类,比如 ServiceClass,它有一些方法(getMethod()postMethod() 等)来发出一些 REST GET/POST 请求(就其本身而言,它工作得很好)。现在,我想公开一个 DSL,以便最终用户只需说出类似以下内容:callService ServiceClass 方法 getMethod 并且我可以执行 ServiceClass.getMethod()

到目前为止我一直在尝试的是:我在某处放置了一个 userCommand 文件,现在只显示:callService ServiceClass

我有一个 sample.groovy 现在就可以执行此操作:

class Sample {
def srvc
def callService(srvc) {
this.srvc = srvc
"Calling $srvc"
}
}

我有一个 integrator.groovy 文件,其中包含:

//necessary imports
class Integrator{
def sample = new Sample()
def binding = new Binding([
sample:sample,
ServiceClass: new ServiceClass(),
callService:sample.&callService ])
def shell = new GroovyShell(binding)

def runIt() {
shell.evaluate("userCommand")
}
}

然后要从我的 Java 应用程序运行它,我正在执行以下操作:

public static void main(String[] args) {
Integator i = new Integrator()
i.runIt();
}

但这根本行不通。使用上面的语法,它表示:

Exception in thread "main" java.lang.NullPointerException: Cannot invoke method setVariable() on null object....

有人可以告诉我如何传递参数并创建对象实例吗?

最佳答案

更新:考虑以下userCommand文件:

文件用户命令:

callService ServiceClass getMethod

这将被 groovy 解析为 callService(ServiceClass).getGetMethod()。因此,您需要一个 getProperty 方法来将调用重新路由到正确的方法:

文件Dsl.groovy:

class Dsl {
static void main(args) {
new Integrator().runIt()
}
}

class DslDelegate {
def service
def callService(service) {
this.service = service
this
}

def getProperty(String prop) {
if (prop == "getMethod") { service.getMethod() }
else { throw new RuntimeException("Unrecognized property '$prop'") }
}
}

class ServiceClass {
def getMethod() { "serviceClass getMethod" }
}

class Integrator{
def dslDelegate = new DslDelegate()
def binding = new Binding([
ServiceClass: new ServiceClass(),
callService:dslDelegate.&callService ])
def shell = new GroovyShell(binding)

def runIt() {
assert shell.evaluate(new File("userCommand")) ==
"serviceClass getMethod"
}
}

注意,我重命名了 Sample 类,因此它成为 ServiceClass 的委托(delegate)者。现在它分离了 DSL/服务职责。

您也可以执行 callService ServiceClass 方法 getMethod,但需要更多代码。

关于java - Groovy DSL 与 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27315115/

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