动态语言需要在运行时给类增加方法或属性
根据上章groovy的执行过程可以看到,groovy的执行过程是将类一次加载,且不能修改,那么groovy是如何实现动态的呢?
groovy中包含MetaClass接口,该接口扩展了MetaObjectProtocol接口,这就是我们通常所说的MOP协议了,这个MetaClass
能在运行时处理如拦截、重定向、增加/删除方法等等之类的方法调用
groovy类生成器生成的字节码内容是不同与java类生成器的,如有一个“foo”语句,groovy生成的字节码是这样:
getMetaClass().invokeMethod(this, "foo", EMPTY_PARAMS_ARRAY)
eg:
def code = '1 + '
code += System.getProperty('os.version')
println code//prints “1 + 5.1”
println evaluate(code)//prints “6.1”
eg2:
class Person {
String name
}
// 添加自我介绍的行为
Person.metaClass.introduce << {println "I'm $name"}
// 添加性别属性,默认为男(Male)
Person.metaClass.sex = "Male"
def person = new Person(name:"name")
person.introduce()
println person.sex