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