Необходимо прочитать эту статью Vance. Это вдается в подробности о том, почему методы не всегда встраиваются JIT'er, даже если выглядит абсолютно очевидным, что они должны быть.
http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx
Используйте 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
}
Вы должны иметь возможность сделать что-то вроде:
SomeObj.metaClass.getMetaMethod("someMethod")
Или вы можете вернуться к старому доброму API отражения Java.
Просто реализуйте 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
Этого можно добиться, используя 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);