Подтвердить что ты не робот

В groovy существует ли способ проверить, имеет ли объект данный метод?

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

def value = someObj.someMethod()

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

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

4b9b3361

Ответ 1

Используйте 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
}

Ответ 2

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

SomeObj.metaClass.getMetaMethod("someMethod")

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

Ответ 3

Просто реализуйте метод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

Вы можете достичь этого, используя 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);

Ответ 5

если класс:

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

если объект:

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