`
等待雨季的到来
  • 浏览: 3287 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用ExpandoMetaClass的几个陷阱

 
阅读更多
附上符合规范并且正确的Code
MainClass.metaClass {
        constructor = {
            String name ->
            println("I'm the subsequent constructor!")
            return delegate.newInstance()
        }
        
        sayHi {
            ->
            println("Say Hello")
        }
} 


1.ExpandoMetaClass的语法比较特殊,有一些特定的DSL在里面
比如下面两段代码 熟悉Java的程序员可能想当然的就认为是相等的,但是在ExpandoMetaClass里是两个概念
// 正确
MainClass.metaClass{
}
// 错误
def metaClass = MainClass.metaClass
metaClass{
}

2.我想Groovy的官方文档对于constructor的dynamic编程忽略了一些非常重要的东西
第一个是在MetaClass里constructor不能写成下面的形式
constructor {
}

只能是constructor = {}或consturctor << {}

第二个必须要切记非常容易犯的错误是
在constructor的最后一行 一定要加上 delegate.newInstance()或者类似的操作
原因 对于此中DSL编程来说 Constructor只会当成一个普通的方法去run,当New对象的时候并不会返回当前对象的instance!也就是说你拿到的只会是null,所以delegate.newInstance()放在最后一行是必须的,或者其他类似的返回当前对象instance的操作!

3.在constructor里,无法直接读取Class 的 instance variable
原因,对象并没有构造完成,constructor {}只能看做是一个普通的Closure,Groovy仅仅会尝试在closure的owner和closure内部读取此变量!
分享到:
评论

相关推荐

    Groovy MOP

    Groovy的MOP机制主要包括以下几个关键概念: 1. **MetaClass**: MetaClass是Groovy MOP的核心,它是任何Groovy对象的元数据容器。MetaClass存储了对象的方法、属性以及如何调用这些方法和属性的信息。你可以为任何...

    groovy动态方法

    下面是一个简单的例子,展示了如何使用`ExpandoMetaClass`为`String`类添加一个新的`reverseWords`方法: ```groovy import groovy.lang.ExpandoMetaClass ExpandoMetaClass.enableGlobally() // 开启全局元编程...

    groovy经典入门

    Groovy的经典入门通常会涵盖以下几个核心知识点: 1. **基础语法**:Groovy的语法与Java类似,但更简练。例如,变量声明不需要类型,可以使用`def`关键字。此外,Groovy支持闭包(closures),这是一种强大的功能,...

    Groovy1.8 beta 官方文档-1269页

    这个特性为Groovy1.8提供了强大的扩展性,文档将详细解释如何定义和使用AST转换。 在并发编程方面,Groovy1.8支持Java的并发工具类,如ExecutorService和Future,同时也提供了一些特有的并发构造,如Promise和...

    Groovy 1.5 文档荟萃

    文档可能会详细解释如何使用类别和闭包来添加新方法,以及元编程的概念,如MetaClass和ExpandoMetaClass。 5. **Groovy的Web开发**:Groovy在Web开发中的应用,如构建RESTful服务、使用Grails框架开发全功能Web应用...

    Groovy in Action源代码

    通过源代码,你可以看到如何使用MetaClass、ExpandoMetaClass等来扩展类的功能,实现动态属性和方法。 4. **GString与模板引擎**:Groovy的GString能方便地进行字符串插值,源代码中可能会包含使用GString构建动态...

    groovy-docs-1.5.4.zip

    8. **Spock框架**:虽然1.5.4版本的文档可能不会详细介绍,但Groovy通常与Spock一起使用,后者是一个强大的行为驱动开发(BDD)框架,用于编写简洁、可读性强的测试。 9. **Grails**:Groovy的一个重要应用是在Web...

    groovy-and-grails-training-greach-2015:greach 2015 期间的 groovy 和 grails 培训材料

    在GREACH 2015大会上,Groovy和Grails的培训内容可能包括以下几个方面: 1. Groovy基础:介绍Groovy的基本语法,如变量声明、控制结构、函数、类定义等。此外,还会讲解Groovy与Java的互操作性,如何在Groovy代码中...

    Groovy in Action, Second Edition 源码

    1. **动态类型与静态类型**:Groovy允许程序员在同一个项目中同时使用动态类型和静态类型,提高了代码的灵活性和可读性。通过`@groovy.lang.StaticTypeChecking`注解,开发者可以在需要时启用静态类型检查。 2. **...

    groovy基础教程源码,很全面

    例如,通过`ExpandoMetaClass`可以在运行时添加方法或属性。 5. ** Grape**: Grape是Groovy内置的依赖管理工具,类似于Java的Maven或Gradle,它能自动下载并管理项目所需的库。 6. **构建工具**: Groovy常用于...

    Grails 1.1 的动态编码方案(Dynamic Encoding Methods)

    例如,通过`ExpandoMetaClass`,你可以在不修改原有类源码的情况下添加新方法或者改变已有方法的行为。这对于快速迭代和原型开发非常有用,也使得Grails成为一种非常适合敏捷开发的框架。 在Grails 1.1中,动态编码...

Global site tag (gtag.js) - Google Analytics