在groovy,有没有办法来检查一个对象是否有一个给定的方法?

假设我有一个对象someObj的不确定types,我想要做的事情如:

 def value = someObj.someMethod() 

如果不能保证“someObj”实现了someMethod()方法,如果没有,就返回null

在Groovy中是否有类似的instanceof呢,还是我需要用一个instanceof检查来包装if语句?

使用respondsTo

 class Foo { String prop def bar() { "bar" } def bar(String name) { "bar $name" } } def f = new Foo() // Does f have a no-arg bar method if (f.metaClass.respondsTo(f, "bar")) { // do stuff } // Does f have a bar method that takes a String param if (f.metaClass.respondsTo(f, "bar", String)) { // do stuff } 

你应该能够做到这样的事情:

 SomeObj.metaClass.getMetaMethod("someMethod") 

或者你可以回到老的JavareflectionAPI。

只要在你的类中实现methodMissing:

 class Foo { def methodMissing(String name, args) { return null; } } 

然后,每次尝试调用一个不存在的方法时,都会得到一个空值。

 def foo = new Foo(); assert foo.someMethod(), null 

欲了解更多信息,请看这里: http : //groovy.codehaus.org/Using+methodMissing+and+propertyMissing

您可以通过使用getMetaMethod和安全导航操作符来实现此getMetaMethod ?.

 def str = "foo" def num = 42 def methodName = "length" def args = [] as Object[] assert 3 == str.metaClass.getMetaMethod(methodName, args)?.invoke(str, args); assert null == num.metaClass.getMetaMethod(methodName, args)?.invoke(num, args); 

如果上课:

  MyClass.metaClass.methods*.name.any{it=='myMethod'}//true if exist 

如果对象:

 myObj.class.metaClass.methods*.name.any{it=='myMethod'}//true if exist