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

时间:2009-10-07 21:03:09

标签: groovy

假设我有一个不确定类型的对象someObj,我想做类似的事情:

def value = someObj.someMethod()

如果不能保证'someObj'实现someMethod()方法,如果没有,则只返回null

在Groovy中是否有类似的内容,或者我是否需要将其包含在带instanceof项检查的if语句中?

6 个答案:

答案 0 :(得分:66)

使用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
}

答案 1 :(得分:4)

您应该可以执行以下操作:

SomeObj.metaClass.getMetaMethod("someMethod")

或者你可以回到旧的Java反射API。

答案 2 :(得分:4)

在你的班级中实施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

答案 3 :(得分:2)

您可以将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);

答案 4 :(得分:2)

如果上课:

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

如果对象:

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

答案 5 :(得分:1)

以非常简洁的方式,你可以使用它:

if(someObj.&methodName){
 //it means someObj has the method
}