web-dev-qa-db-ja.com

groovyでは、オブジェクトに特定のメソッドがあるかどうかを確認する方法はありますか?

不確定なタイプのオブジェクトsomeObjがあると仮定して、次のようなことをしたいと思います。

_def value = someObj.someMethod()
_

'someObj'がsomeMethod()メソッドを実装するという保証がない場合、実装されていない場合は、nullを返すだけです。

Groovyにそのようなものはありますか、それともinstanceofチェックを使用してifステートメントでラップする必要がありますか?

41
Electrons_Ahoy

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
}
69
Dónal

次のようなことができるはずです。

SomeObj.metaClass.getMetaMethod("someMethod")

または、古き良きJavaリフレクションAPIにフォールバックすることもできます。

4
Langali

クラスに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

4
marcospereira

これは、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
2
Abdennour TOUMI

非常に簡潔な方法で、これを使用できます。

if(someObj.&methodName){
 //it means someObj has the method
}
1
dsharew