Assuming that I have an object someObj of indeterminate type, I'd like to do something like:
def value = someObj.someMethod()Where there's no guarantee that 'someObj' implements the someMethod() method, and if it doesn't, just return null.
Is there anything like that in Groovy, or do I need to wrap that in an if-statement with an instanceof check?
6 Answers
Use 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
} 0 Just implement methodMissing in your class:
class Foo { def methodMissing(String name, args) { return null; }
}And then, every time you try to invoke a method that doesn't exist, you will get a null value.
def foo = new Foo();
assert foo.someMethod(), nullFor more information, take a look here:
1You should be able to do something like:
SomeObj.metaClass.getMetaMethod("someMethod")Or you can fall back to the good old Java reflection API.
0You can achieve this by using getMetaMethod together with the safe navigation operator ?.:
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); if class :
MyClass.metaClass.methods*.name.any{it=='myMethod'}//true if existif object :
myObj.class.metaClass.methods*.name.any{it=='myMethod'}//true if exist In very concise way you can use this:
if(someObj.&methodName){ //it means someObj has the method
}