groovy的动态性

动态语言需要在运行时给类增加方法或属性

根据上章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

你可能感兴趣的:(java,扩展,语言,groovy)