从1.1版本开始Groovy支持一套更丰富的API来评估运行时元类,将它与ExpandoMetaClass(可扩展元类)结合起来使用,可使得Groovy成为无比强大的元编程语言(language for meta-programming)。
为了获得特定Groovy类使用的一系列的方法(或者Groovy的MetaMethod(元方法)实例),请检查它的元类:
println obj.metaClass.methods println obj.metaClass.methods.find { it.name.startsWith("to") }
对于方法,也可以一样操作:
println obj.metaClass.properties println obj.metaClass.properties.find { it.name.startsWith("to") }
当你要弄清一个对象是否支持一个特定方法的时候,获取一系列方法有时候会超乎你想要的,这在元编程情境下太稀松平常了。
从1.1版本开始,你可以使用respondsTo和hasProperty来办到:
class Foo { String prop def bar() { "bar" } def bar(String name) { "bar $name" } def add(Integer one, Integer two) { one + two} } def f = new Foo() if(f.metaClass.respondsTo(f, "bar")) { // do stuff } if(f.metaClass.respondsTo(f, "bar", String)) { // do stuff } if(!f.metaClass.respondsTo(f, "bar", Integer)) { // do stuff } if(f.metaClass.respondsTo(f, "add", Integer, Integer)) { // do stuff } if(f.metaClass.hasProperty(f, "prop")) { // do stuff }
respondsTo方法实际上会返回一个MetaMethod实例的列表,这样你就可以在问题查询和结果评估中使用了。
注意:respondsTo只能用于实体方法并且通过ExpandoMetaClass(可扩展元类)来添加,它并不可以在你重载invokeMethod或methodMissing的时候使用。所以,不可能在不调用方法的情况下说出一个对象是否能响应一个方法。