Binding 在groovy脚本执行中拦截绑定对象中的闭包调用
我的目标是使用绑定执行groovy脚本,其中函数是预定义的,拦截器注销执行时间和闭包计算结果。我的示例代码是:Binding 在groovy脚本执行中拦截绑定对象中的闭包调用,binding,groovy,closures,metaclass,Binding,Groovy,Closures,Metaclass,我的目标是使用绑定执行groovy脚本,其中函数是预定义的,拦截器注销执行时间和闭包计算结果。我的示例代码是: binding.login = { -> binding.event.appname=='login' } def gse = new GroovyScriptEngine("src/main/resources/rules") gse.run('DSL.groovy', binding) 在我的脚本中,我正在调用login方法。一切都正常,只是我不知道
binding.login = { ->
binding.event.appname=='login'
} def gse = new GroovyScriptEngine("src/main/resources/rules")
gse.run('DSL.groovy', binding)
在我的脚本中,我正在调用login方法。一切都正常,只是我不知道如何使用元类拦截它。我的尝试像
Binding.metaClass.invokeMethod = { String name, args ->
println ("Call to $name intercepted... ")
不起作用。后来我发现闭包是绑定的属性,而不是方法。
在这种情况下,有没有办法执行拦截以及如何执行?元类的正确对象是什么?值得注意的是,我的闭包在另一个嵌套闭包中执行。
谢谢我不知道这是否是更好的解决方案,但我通过在绑定中装饰闭包,实现了您想要的
binding = new Binding([
login : { -> println "binding.login called" },
echo : { String text -> println "test for $text" },
foo : { a, b, c -> println "$a $b $c" }
])
binding.variables.each { key, value ->
if (value instanceof Closure)
{
binding.variables[key] = { Object[] args ->
long t0 = System.currentTimeMillis()
value( *args )
print "[$key method"
print " args: $args "
println " time: ${System.currentTimeMillis() - t0}]"
}
}
}
def gse = new GroovyScriptEngine(".")
gse.run('Bind.groovy', binding)
这是我的Bind.groovy:
如果没有在绑定中将方法定义为闭包,也可以尝试/捕获MissingMethodException
我还建议您在创建DSL时使用Laforge的幻灯片:
在本幻灯片中,Laforge使用扩展脚本的类显示绑定;我认为这是一个好办法。更糟糕
更新
请看一下mrhaki在Guillaume的slideshare中提出的将方法调用委托给基本脚本类的建议:
我刚刚用它在JFugue上实现了一个DSL,它马上就工作了。您尝试过getProperty吗?非常感谢你。我已经在我的DSL中创建了嵌套结构,但它无法处理您的代码,这给了我MissingMethod异常。我还不知道为什么。Guilliame的幻灯片内容非常丰富,使用的示例与Groovy for domain specific Languages一书中的示例相同。谢谢你的链接你确定你没有打错方法吗?我的意思是,我在这里编写的示例在groovy 2.0.1中工作
println " ** executing bind"
login()
echo("echo")
foo("test", 4, "echo")
println " ** bind script done"