不確定なタイプのオブジェクトsomeObj
があると仮定して、次のようなことをしたいと思います。
_def value = someObj.someMethod()
_
'someObj'がsomeMethod()
メソッドを実装するという保証がない場合、実装されていない場合は、null
を返すだけです。
Groovyにそのようなものはありますか、それともinstanceof
チェックを使用してifステートメントでラップする必要がありますか?
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")
または、古き良きJavaリフレクションAPIにフォールバックすることもできます。
クラスにmethodMissingを実装するだけです。
class Foo {
def methodMissing(String name, args) { return null; }
}
そして、存在しないメソッドを呼び出そうとするたびに、null値を取得します。
def foo = new Foo();
assert foo.someMethod(), null
詳細については、こちらをご覧ください: http://groovy.codehaus.org/Using+methodMissing+and+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);
クラスの場合:
MyClass.metaClass.methods*.name.any{it=='myMethod'}//true if exist
オブジェクトの場合:
myObj.class.metaClass.methods*.name.any{it=='myMethod'}//true if exist
非常に簡潔な方法で、これを使用できます。
if(someObj.&methodName){
//it means someObj has the method
}