2012-01-13 68 views
3

我正在学习groovy,并且我有一个关于它的元编程设施的问题。据我所知,groovy中的每个对象实现了groovy.lang.GroovyObject接口(由groovy编译器隐式添加)。后者接口包含的方法getMetaClass(),所以我可以做到以下几点:groovy中的java类的metaClass属性

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

,我不明白的是由Java编译器像java.lang.String中编译对象,如何获取元类属性的东西。这个属性是否在通过MetaClassRegistry与Java类相关的实际MetaClass对象中定义?

回答

3

除了通过元对象协议添加的方法之外,Groovy还使用groovy.runtime.DefaultGroovyMethods类中定义的其他方法来扩充JDK中的类。 List和其他收集方法可以使用如eachcollect。相同的机制将getMetaClass方法添加到java.lang.Object

+0

好的,但是如何在groovy.runtime.DefaultGroovyMethods中定义的这些方法被调用? groovy编译器是否显式查找对jdk类的方法调用并拦截这些以生成调用DefaultGroovyMethods中定义的方法的字节码?这是否意味着只有在jdk中定义的java类才能获得getMetaClass()方法? – 2012-01-14 00:25:08

+0

@ JamesV.H。那么,Groovy对象显然拥有这个属性 - “获得方法”是什么意思? – 2012-01-14 00:34:05

+1

@DaveNewton是的我明白在groovy中编译的对象具有属性,在那里没有问题。用java编译器编译的类显然没有属性,我们仍然可以调用它们的metaClass属性。 Ataylor评论了添加方法的定义(在DefaultGroovyMehods中),而不是关联机制如何工作。 – 2012-01-14 01:25:17

1

正确,POJO在注册表中查找它们的元类。

This presentation提供Groovy和POJ对象如何使用元类的高级概述。 (注意它有点老了)。

+1

链接已损坏:S – Hilikus 2016-11-17 21:31:48