В groovy есть ли способ проверить, есть ли у объекта данный метод? - PullRequest
40 голосов
/ 08 октября 2009

Предполагая, что у меня есть объект someObj неопределенного типа, я хотел бы сделать что-то вроде:

def value = someObj.someMethod()

Если нет гарантии, что someObj реализует метод someMethod(), а если нет, просто верните null.

Есть ли что-то подобное в Groovy или мне нужно обернуть это в оператор if с проверкой instanceof?

Ответы [ 6 ]

66 голосов
/ 08 октября 2009

Использование 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
}
4 голосов
/ 08 октября 2009

Просто реализуйте метод Missing в вашем классе:

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

4 голосов
/ 08 октября 2009

Вы должны быть в состоянии сделать что-то вроде:

SomeObj.metaClass.getMetaMethod("someMethod")

Или вы можете вернуться к старому доброму API отражения Java.

3 голосов
/ 21 октября 2009

Этого можно добиться, используя 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);
2 голосов
/ 05 ноября 2014

если класс:

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

если объект:

myObj.class.metaClass.methods*.name.any{it=='myMethod'}//true if exist
1 голос
/ 08 мая 2018

Очень кратко вы можете использовать это:

if(someObj.&methodName){
 //it means someObj has the method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...