Java类在Groovy中的metaClass属性

4

我正在学习Groovy,对其元编程功能有疑问。据我所知,Groovy中的每个对象都实现了groovy.lang.GroovyObject接口(由Groovy编译器隐式添加)。后者接口包含getMetaClass()方法,因此我可以执行以下操作:

class MyGroovyClass{
}
def myGroovyClass = new MyGroovyClass();
println myGroovyClass.metaClass.name

我不明白的是,像java.lang.String这样的对象是如何获得metaClass属性的。这个属性是在MetaClassRegistry通过关联MetaClass对象与java类定义的吗?
2个回答

3
除了使用元对象协议添加的方法外,Groovy 还通过在 groovy.runtime.DefaultGroovyMethods 类中定义附加方法来增强 JDK 中的类。例如,List 和其他集合类可以得到像 eachcollect 这样的方法。同样的机制会在 java.lang.Object 中添加一个 getMetaClass 方法。

好的,但是这些在groovy.runtime.DefaultGroovyMethods中定义的方法如何被调用呢?Groovy编译器是否明确查找对jdk类的方法调用并拦截它们以生成调用DefaultGroovyMethods中定义的方法的字节码?这是否意味着只有在jdk中定义的java类才能获得getMetaClass()方法? - James V.H.
@JamesV.H. 嗯,Groovy 对象显然具有属性——你所说的“获取方法”是什么意思? - Dave Newton
1
@DaveNewton,是的,我明白在Groovy中编译的对象具有该属性,这里没有问题。使用Java编译器编译的类显然没有该属性,但我们仍然可以在它们上调用metaClass属性。Ataylor评论了添加方法的定义位置(在DefaultGroovyMehods中),但没有解释关联机制的工作方式。 - James V.H.
@JamesV.H. Groovy的方法分派机制在演示文稿中有描述。 - Dave Newton
只是一个快速的备注,看起来在Groovy 2.0中,单一的DefaultGroovyMethods类正在被拆分为每个被装饰类别的单独类。 - tim_yates
显示剩余2条评论

1

是的,POJOs会在注册表中查找它们的元类。

此演示文稿提供了有关元类如何被Groovy和POJ对象使用的高级概述。(但请注意它有一点老旧。)


1
链接损坏了:S - Hilikus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接