作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 groovy 中,创建方法闭包非常容易,例如:
groovy:000> p = 1.&plus
===> org.codehaus.groovy.runtime.MethodClosure@a7981d5
groovy:000> p(3)
===> 4
Class
的实例时会失败。 :
groovy:000> List.isInstance([])
===> true
groovy:000> t = List.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@31ca1a68
groovy:000> t([])
ERROR groovy.lang.MissingMethodException:
No signature of method: java.util.List.isInstance() is applicable for argument types: (java.util.ArrayList) values: [[]]
at groovysh_evaluate.run (groovysh_evaluate:2)
...
groovy:000> t = List.class.&isInstance
===> org.codehaus.groovy.runtime.MethodClosure@7b34c5ff
groovy:000> t([])
ERROR groovy.lang.MissingMethodException:
No signature of method: java.util.List.isInstance() is applicable for argument types: (java.util.ArrayList) values: [[]]
at groovysh_evaluate.run (groovysh_evaluate:2)
...
最佳答案
当您在 Class
的实例上使用方法指针时那么它必须明确地使用 doCall()
MethodClosure
提供的方法而不是使用默认的 call()
的 Closure
.doCall
来自 MethodClosure
的方法覆盖 Closure 的 doCall
并使用 invokeMethod
拦截方法调用而不是调用 call()
来自 Closure
.MethodClosure
如果您明确使用 InvokerHelper
也可以使用与 doCall
同义在 MethodClosure
或者干脆metaClass
列表。
import org.codehaus.groovy.runtime.InvokerHelper
t = List.&isInstance
assert t.owner.simpleName == 'List'
assert t.doCall([]) == true
assert InvokerHelper.getMetaClass(t.owner).
invokeStaticMethod(t.owner, 'isInstance', []) == true
assert List.metaClass.invokeStaticMethod(t.owner, 'isInstance', []) == true
Class
的实例,则使用 MOP 的.
&plus
因为方法指针是在 POJO 上创建的,所以可以正常工作。
关于groovy - 为什么 Class 对象的方法闭包会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17689958/
我是一名优秀的程序员,十分优秀!