在Groovy中,有没有一种方法可以检查一个对象是否具有给定的方法?

48
假设我有一个类型不确定的对象someObj,我想要做类似这样的事情:
def value = someObj.someMethod()

在没有保证'someObj'实现了someMethod()方法的情况下,如果没有实现,就返回null

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


一种方法是按照https://dev59.com/G3E85IYBdhLWcg3w2HRa的方式迭代`.properties`。 - MarkHu
6个回答

77

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

6

只需在您的类中实现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


这意味着所有没有someMethod行为的对象都必须实现该方法吗? - Langali

4
您可以使用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
你应该能够做到类似以下操作:
SomeObj.metaClass.getMetaMethod("someMethod")

或者你可以回归到老牌的Java反射API。


2

如果有class:

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

如果对象存在:

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

-1

你可以用非常简洁的方式来使用这个:

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

希望它能正常工作!即使没有给定名称的方法,someObj.&methodName始终返回一个闭包。这一定是由于在运行时解析具有调用参数的方法所致。参见 https://docs.groovy-lang.org/latest/html/documentation/core-operators.html#method-pointer-operator。 - Ludovic Ronsin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接