2013-07-17 34 views
4

在Groovy中這是很容易地創建一個方法關閉,例如:爲什麼Class對象上的方法關閉失敗?

groovy:000> p = 1.&plus 
===> [email protected] 
groovy:000> p(3) 
===> 4 

但是,由於某種原因,欲以Class實例時失敗:

groovy:000> List.isInstance([]) 
===> true 
groovy:000> t = List.&isInstance 
===> [email protected] 
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 
===> [email protected] 
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) 
     ... 

這是很容易解決這個問題,但我想明白爲什麼會發生這種情況。 MOP中有什麼可以阻止它的工作,等等?

回答

3

當你使用一個方法指針上的Class實例,然後它明確地使用由MethodClosure提供的,而不是使用默認的Closurecall()doCall()方法。從MethodClosure覆蓋Closure的doCall

doCall方法和攔截利用invokeMethod而不是調用從Closurecall()方法調用。

MethodClosure也將工作,如果你明確地使用InvokerHelper是同義的MethodClosuredoCall或者乾脆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 

MOP的invokeStaticMethod如果對象是的Class一個實例被使用。

另一方面,&plus工作正常,因爲方法指針是在POJO上創建的。

相關問題