Groovy 提供了一个MetaClass,来提供对对象的结构解析。
先看一个例子:
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()
//通过respondsTo,判断对象是否支持某特征的方法
if(f.metaClass.respondsTo(f, "bar")) {
println "Class Foo has functions : bar";
}
if(f.metaClass.respondsTo(f, "bar", String)) {
println "Class Foo has a function named /"bar/" which has a string parameter";
}
//通过hasProperty,判断对象是否支持某个属性
if(f.metaClass.hasProperty(f, "prop")) {
println "Class Foo has a property named /"prop/" ";
}
从上述的例子中,可以看出通过MetaClass,很容易判定一个对象有什么属性和方法。不过值得分析的是,在Java语法中,通过一个对象的getClass()可以得到一个Class,这个Class也能判别一个类的属性和方法,为什么还要用MetaClass呢?
一个根本的原因应该在于MetaClass可以更加反映Groovy的动态属性和方法,静态的内容,通过二者都可以得到。
其他方面的差异,还有待于更深入的研究。