通过运行时元编程,我们可以将拦截、注入甚至合成类和接口方法的决定推迟到运行时。为了深入理解 Groovy 的元对象协议 (MOP),我们需要了解 Groovy 对象和 Groovy 的方法处理。在 Groovy 中,我们使用三种对象:POJO、POGO 和 Groovy 拦截器。Groovy 允许以不同的方式对所有类型的对象进行元编程。
- POJO - 一个常规 Java 对象,其类可以用 Java 或任何其他 JVM 语言编写。
- POGO - 一个 Groovy 对象,其类是用 Groovy 编写的。它默认扩展java.lang.Object并实现了groovy.lang.GroovyObject接口。
- Groovy Interceptor - 一个 Groovy 对象,它实现了groovy.lang.GroovyInterceptable接口并具有方法拦截能力,这在GroovyInterceptable部分中进行了讨论。
对于每个方法调用,Groovy 都会检查对象是 POJO 还是 POGO。对于 POJO,Groovy会从groovy.lang.MetaClassRegistry中获取它的MetaClass
,并将方法调用委托给它。对于 POGO,Groovy 需要更多步骤,如下图所示: