假设我有一个不确定类型的对象someObj
,我想做类似的事情:
def value = someObj.someMethod()
如果不能保证'someObj'实现someMethod()
方法,如果没有,则只返回null
。
在Groovy中是否有类似的内容,或者我是否需要将其包含在带instanceof
项检查的if语句中?
答案 0 :(得分:66)
使用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
}
答案 1 :(得分:4)
您应该可以执行以下操作:
SomeObj.metaClass.getMetaMethod("someMethod")
或者你可以回到旧的Java反射API。
答案 2 :(得分:4)
在你的班级中实施methodMissing:
class Foo {
def methodMissing(String name, args) { return null; }
}
然后,每次尝试调用不存在的方法时,都会得到一个空值。
def foo = new Foo();
assert foo.someMethod(), null
有关详细信息,请查看此处:http://groovy.codehaus.org/Using+methodMissing+and+propertyMissing
答案 3 :(得分:2)
您可以将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);
答案 4 :(得分:2)
如果上课:
MyClass.metaClass.methods*.name.any{it=='myMethod'}//true if exist
如果对象:
myObj.class.metaClass.methods*.name.any{it=='myMethod'}//true if exist
答案 5 :(得分:1)
以非常简洁的方式,你可以使用它:
if(someObj.&methodName){
//it means someObj has the method
}