Groovy基础与实践——MetaClass何时创建

本文探讨了Groovy中MetaClassRegistry如何维护Class与MetaClass的映射关系。特别是介绍了映射表中键值对的创建时机:即当首次尝试获取某个Groovy类的MetaClass时,若未找到则会创建并关联。

MetaClassRegistry 维护着class和meta=class之间的对应关系。那么这个映射表中键值对又是在什么时候添加的喃?

有两种情况,比如我们的代码中主动地设置,比如我们使用了ExpandoMetaClass来扩展java类,另外一种情况是就是Groovy本身的Class是何时与其MetaClass挂钩的?

之前有猜想过,这种映射关系是在加载了groovy的Class之后,也就是装载了groovy源文件分析出class之后便创建了其对应的 metaclass的映射。但是我翻了Groovy 源码没有发现在加载class的时候进行metaclass设置。有一段时间没有找到痕迹,今天突然猜想莫非是在获取的时候做了设置,这是很多缓存策略的 实现方法,只有在第一次访问的时候才去正在设置。

代码还真是隐藏得深入,从GroovyObjectSupport的getMetaClass入手,经过MetaClassRegistry的包 装,最终是从ClassInfo的内部类ClassInfoSet中获得的。ClassInfoSet最终继承自 AbstractConcurrentMap,AbstractConcurrentMap的getOrPut方法便是在没有的情况下创建一个值并返回。 也就是说第一次寻找一个Groovy class 的metaclass的时候找不到,便会创建一个与之对应。只不过这个创建和放置的过程隐藏在了基类中。

 (下一篇介绍MetaClass的invokeMethod方法的实现)

Groovy中,Binding是一个非常重要的类,它允许我们在运行时动态地创建变量和方法,并将它们绑定到一个特定的上下文中。这个上下文可以是一个Groovy脚本、一个Groovy类或一个Java类。 在实际开发中,我们通常需要在多个Groovy脚本之间共享一些代码或变量。这时,我们可以使用Binding来实现共享。具体来说,我们可以在一个Groovy脚本中创建一个Binding对象,并将需要共享的变量绑定到这个对象中。然后,在其他Groovy脚本中,我们可以通过访问这个Binding对象来获取这些共享的变量。 举个例子,假设我们有两个Groovy脚本A.groovy和B.groovy,它们都需要使用同一个变量greeting。我们可以在A.groovy创建一个Binding对象,并将greeting绑定到这个对象中: ``` def binding = new Binding() binding.setVariable("greeting", "Hello, world!") ``` 然后,在B.groovy中,我们可以通过访问这个Binding对象来获取greeting变量: ``` def binding = new Binding() def greeting = binding.getVariable("greeting") println greeting ``` 这样,我们就可以在不同的Groovy脚本之间共享变量了。 除了变量,我们还可以通过Binding共享方法。具体来说,我们可以在一个Groovy脚本中定义一个方法,并将它绑定到一个Binding对象中。然后,在其他Groovy脚本中,我们可以通过访问这个Binding对象来调用这个方法。 举个例子,假设我们有两个Groovy脚本A.groovy和B.groovy,它们都需要使用同一个方法sayHello。我们可以在A.groovy中定义这个方法,并将它绑定到一个Binding对象中: ``` def sayHello(name) { println "Hello, $name!" } def binding = new Binding() binding.setVariable("sayHello", &sayHello) ``` 然后,在B.groovy中,我们可以通过访问这个Binding对象来调用sayHello方法: ``` def binding = new Binding() def sayHello = binding.getVariable("sayHello") sayHello("world") ``` 这样,我们就可以在不同的Groovy脚本之间共享方法了。 综上所述,通过Binding,我们可以在不同的Groovy脚本之间共享变量和方法。这种方式非常灵活,也非常适合一些需要共享代码的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值