在groovy中,是否有方法检查对象是否具有给定的方法?

在groovy中,是否有方法检查对象是否具有给定的方法?,groovy,Groovy,假设我有一个类型不确定的对象someObj,我想做如下事情: def value = someObj.someMethod() SomeObj.metaClass.getMetaMethod("someMethod") 无法保证“someObj”实现了someMethod()方法,如果没有,只需返回null Groovy中是否有类似的功能,或者我是否需要在if语句中使用instanceof检查来包装它?您应该能够执行以下操作: def value = someObj.someMethod()

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

def value = someObj.someMethod()
SomeObj.metaClass.getMetaMethod("someMethod")
无法保证“someObj”实现了
someMethod()
方法,如果没有,只需返回
null


Groovy中是否有类似的功能,或者我是否需要在if语句中使用
instanceof
检查来包装它?

您应该能够执行以下操作:

def value = someObj.someMethod()
SomeObj.metaClass.getMetaMethod("someMethod")

或者,您也可以回到旧的Java反射API。

只需在类中实现methodMissing:

class Foo {
   def methodMissing(String name, args) { return null; }
}
然后,每次尝试调用不存在的方法时,都会得到一个空值

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

有关更多信息,请查看此处:

使用
响应

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
}

您可以通过与安全导航操作符一起使用
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

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

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

这意味着所有没有someMethod行为的对象都必须实现该方法?一种方法是按照