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

Необходимо прочитать эту статью Vance. Это вдается в подробности о том, почему методы не всегда встраиваются JIT'er, даже если выглядит абсолютно очевидным, что они должны быть.

http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

41
задан Electrons_Ahoy 7 October 2009 в 21:03
поделиться

4 ответа

Используйте 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
}
68
ответ дан 27 November 2019 в 00:32
поделиться

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

SomeObj.metaClass.getMetaMethod("someMethod")

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

4
ответ дан 27 November 2019 в 00:32
поделиться

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

class Foo {
   def methodMissing(String name, args) { return null; }
}

А затем , каждый раз, когда вы пытаетесь вызвать метод, которого не существует, вы получаете нулевое значение.

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

Для получения дополнительной информации посмотрите здесь: http://groovy.codehaus.org/Using+methodMissing + и + propertyMissing

4
ответ дан 27 November 2019 в 00:32
поделиться

Этого можно добиться, используя 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);
3
ответ дан 27 November 2019 в 00:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: