<!----><!---->
本篇介绍groovy 的MetaClasses ,MetaClass 是Groovy 动态编程比较重要的组成。
(以下出现的代码片段是在groovy1.5.3测试通过,希望各位可以运行之)。
1.MetaClass
groovy中出现的每个类都有其对应的MetaClass。MetaClas是一个接口,该接口扩展了MetaObjectProtocol接口,这就是我们通常所说的MOP协议了。
MetaClass的实现类主要有
MetaClassImpl 是通用的实现类。ClosureMetaClass是闭包类特有的MetaClass。ExpandoMetaClass是用户扩展groovy类行为时用到的MetaClass
println 'first:---> '+'test'.metaClass
println 'String.metaClass:---> '+String.metaClass
println 'after String.metaClass:---> '+'test'.metaClass
执行结果为
first:---> groovy.lang.MetaClassImpl@183f74d[class java.lang.String]
String.metaClass:---> groovy.lang.ExpandoMetaClass@8a0d5d[class java.lang.String]
after String.metaClass:---> groovy.lang.ExpandoMetaClass@8a0d5d[class java.lang.String]
对于这样的结果你是不是会感觉到奇怪呢?
下面我将结合Groovy实现代码来解释这个过程
第一句脚本
通过String实例对象来获得,Groovy为其初始化的groovy.lang.MetaClassImpl@183f74d[class java.lang.String]对象。这个对象将在MetaClassRegistryImpl中和String类关联起来。也就是注册了String.class和
groovy.lang.MetaClassImpl的对象关系。
第二句脚本
通过String类去访问 metaClass对象,不过这一次是调用了类DefaultGroovyMethods中的方法
/**
* Adds a "metaClass" property to all class objects so you can use the syntax
* <code>String.metaClass.myMethod = { println "foo" }</code>
*
* @param c The java.lang.Class instance
* @return An MetaClass instance
*/
public static MetaClass getMetaClass(Class c) {
MetaClassRegistry metaClassRegistry = GroovySystem.getMetaClassRegistry();
MetaClass mc = metaClassRegistry.getMetaClass(c);
if (mc instanceof ExpandoMetaClass
|| mc instanceof DelegatingMetaClass && ((DelegatingMetaClass) mc).getAdaptee() instanceof ExpandoMetaClass)
return mc;
else {
MetaClass emc = ExpandoMetaClassCreationHandle.instance.create(c, metaClassRegistry);
emc.initialize();
metaClassRegistry.setMetaClass(c, emc);//并且在metaClassRegistry中注册
return emc;
}
}
第三句脚本又重新通过String实例对象来获得了,但这一次得到的是groovy.lang.ExpandoMetaClass@8a0d5d,这是因为第二句话中对String和其MetaClass对象进行了重新注册。
自此以后系统中所有的String对象的MetaClass对象都一直市是ExpandoMetaClass对象实例。
由于我们举的String例子有点特殊
我们看看对于自定义类的例子
class Foo{
}
def f1 = new Foo();
println f1.metaClass
println Foo.metaClass
println f1.metaClass
def f2 = new Foo()
println f2.metaClass
结果是不是又不一样了?
f1对象的metaClass是被缓存了,只有在调用过
Foo.metaClass
之后,new出来的对象才会使用ExpandoMetaClass
分享到:
相关推荐
Groovy 调用 Java 类groovy 调用 Java class 十分方便,只需要在类前导入该 Java 类,在 Groovy 代码中就可以无缝使用该
scala erlang groovy python 原理 比较 分析
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
groovy入门经典,groovyeclipse 插件
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1groovy eclipse plugin1
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署
Groovy 正则表达式 Groovy正则表达式语法 背景项目使用Gradle作为自动化构建的工具, 闲暇之余对这个工具的使用方式以及其配置文件依赖的Groov
Groovy轻松入门—搭建Groovy开发环境 Groovy轻松入门—搭建Groovy开发环境
Groovy jar包 3.0.
Part 1 The Groovy language Chapter 1 Your way to Groovy Chapter 2 Overture: Groovy basics Chapter 3 Simple Groovy datatypes Chapter 4 Collective Groovy datatypes Chapter 5 Working with closures ...
groovy-2.3.6-installer windows安装版本
Groovy
groovy
什么是 Groovy? Groovy 是 JVM 的一个替代语言 — 替代 是指可以用 Groovy 在 Java 平台上进行 Java 编程,使用方式基本与使用 Java 代码的方式相同。在编写新应用程序时,Groovy 代码能够与 Java 代码很好地结合,...
groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2groovy eclipse plugin2
groovy的eclipse插件
groovy的帮助文档 !!!!!