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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值