groovy

En groovy, ¿hay alguna forma de comprobar si un objeto tiene un método determinado?



groovy java (6)

De manera muy concisa, puedes usar esto:

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

Suponiendo que tengo un objeto someObj de tipo indeterminado, me gustaría hacer algo como:

def value = someObj.someMethod()

Donde no hay garantía de que ''someObj'' implemente el método someMethod() , y si no lo hace, simplemente devuelva null .

¿Hay algo así en Groovy, o tengo que incluirlo en una declaración if con una instanceof verificación?


Debería poder hacer algo como:

SomeObj.metaClass.getMetaMethod("someMethod")

O puede recurrir a la buena y antigua API de reflexión de Java.


Puede lograr esto utilizando getMetaMethod junto con el operador de navegación segura ?. :

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);


Solo implementa methodMissing en tu clase:

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

Y luego, cada vez que intente invocar un método que no existe, obtendrá un valor nulo.

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

Para obtener más información, consulte aquí: http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing


Usa 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 }


si clase:

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

si objeto:

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