评估运行时元类

评估运行时元类

从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") }

使用respondsTo和hasProperty

当你要弄清一个对象是否支持一个特定方法的时候,获取一系列方法有时候会超乎你想要的,这在元编程情境下太稀松平常了。

从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实例的列表,这样你就可以在问题查询和结果评估中使用了。

8-o注意:respondsTo只能用于实体方法并且通过ExpandoMetaClass(可扩展元类)来添加,它并不可以在你重载invokeMethod或methodMissing的时候使用。所以,不可能在不调用方法的情况下说出一个对象是否能响应一个方法。

 
wiki/user_guide/evaluating_the_metaclass_runtime.txt · 最后更改: 2008-09-26 13:15 由 johnny
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki