`
ihuashao
  • 浏览: 4721580 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Groovy探索之MOP 八 运行期内给类和对象添加属性或方法

阅读更多

Groovy探索之MOP 八 运行期内给类和对象添加属性或方法

我们都知道,在Groovy语言中,我们可以使用MOP特性在运行期内添加属性或方法。

这种添加包括两个层面的添加:

  • 第一, 是给一个类添加属性或方法。也就是说,如果我们在运行期内给一个类添加了属性或方法,那么添加了以后,所有这个类实例化的对象,都将拥有了这个属性或方法。
  • 第二, 第二,是给一个对象添加属性或方法。也就是说,如果我们在运行期内给一个对象添加了属性或方法,那么添加了以后,只有这个对象才拥有这个属性或方法。换句话说,如果我们再给这个对象的类实例化一个对象,那么该对象则不能拥有我们刚添加的那个属性或方法。

真的是这样吗?让我们举几个例子来看看吧。

使用ExpondoMetaClass在运行期内给一个类添加属性或方法是我们最最常用的一种在运行期内添加属性或方法的方法。比如,我们有如下的一个类:

class Testor1 {

}

现在,我们就尝试着使用ExpondoMetaClass在运行期内给Testor1添加一个方法,然后来测试它:

def t = new Testor1()

try

{

println 't invoke far'

t.far()

}

catch(Exception e)

{

}

Testor1.metaClass."far" = {

->

println 'far'

}

def t1 = new Testor1()

println 't1 invoke far'

t1.far()

def t2 = new Testor1()

println 't2 invoke far'

t2.far()

测试很简单,我们在添加方法之前实例化一个Testor1对象,然后再添加方法之后实例化两个Testor1对象,分别来测试它们。

结果为:

t invoke far

t1 invoke far

far

t2 invoke far

far

从结果可以看出:在添加方法之前实例化的那个对象不能调用"far"方法,而添加方法之后实例化的两个对象都可以调用"far"方法。

这就是在运行期内给类添加方法或属性的结果。

其实,使用MOP特性在运行期内给类添加属性或方法还有一种方法来实现,它就是下面的这种方法:

def t = new Testor1()

try

{

println 't invoke far'

t.far()

}

catch(Exception e)

{

}

def mc = new ExpandoMetaClass(Testor1.class,true)

mc.far = {

->

println 'far'

}

mc.initialize()

def t1 = new Testor1()

println 't1 invoke far'

t1.far()

def t2 = new Testor1()

println 't2 invoke far'

t2.far()

}

就是使用ExpondoMetaClass类来实例化一个对象,如"def mc = new ExpandoMetaClass(Testor1.class,true)",再给该对象添加一个方法,如:

mc.far = {

->

println 'far'

}

然后,将这个对象实例化,如"mc.initialize()"。

上面代码的运行结果为:

t invoke far

t1 invoke far

far

t2 invoke far

far

跟一种方法的结果一样。

最后,我们来看看如何给一个对象在运行期内添加属性或方法,以及它们的运行结果。

def t = new Testor1()

try

{

println 't invoke far'

t.far()

}

catch(Exception e)

{

}

def t1 = new Testor1()

def emc = new ExpandoMetaClass( Testor1.class, false )

emc.far = { println "far" }

emc.initialize()

t1.metaClass = emc

println 't1 invoke far'

t1.far()

def t2 = new Testor1()

try

{

println 't2 invoke far'

t2.far()

}

catch(Exception e)

{

}

我们还使用"def emc = new ExpandoMetaClass( Testor1.class, false )"语句来给一个对象添加属性或方法,但需要记住的是,第二个参数是"false"。接着,我们就可以添加方法了:

emc.far = { println "far" }

最后,还要做两件事,就是实例化该对象,并且把该对象赋值给t1对象的metaClass属性。如:

emc.initialize()

t1.metaClass = emc

上面代码的运行结果为:

t invoke far

t1 invoke far

far

t2 invoke far

分享到:
评论

相关推荐

    Groovy MOP

    在Java中,我们通常需要通过继承或接口实现来扩展功能,但Groovy的MOP允许我们在运行时动态地改变对象的行为,使得代码更加灵活和动态。 Groovy的MOP机制主要包括以下几个关键概念: 1. **MetaClass**: MetaClass...

    groovy和Java相互调用1

    标题中的“Groovy和Java相互调用1”指的是在编程时如何在Groovy语言环境中调用Java类,以及反之,如何在Java程序中调用Groovy类。这是一种跨语言交互的方式,特别是在混合使用Groovy和Java的项目中非常常见。 ...

    groovy动态方法

    在Groovy中,动态方法是通过元编程(Metaprogramming)实现的,这使得我们可以在运行时修改或添加类的行为。元编程在Groovy中主要通过`MetaClass`接口和`ExpandoMetaClass`类来实现。 `MetaClass`是Groovy中的一个...

    Groovy学习资料

    MOP允许你在运行时操作和扩展任何对象的行为,而类别增强则允许在已有类上添加方法或属性,这在不修改源码的情况下增强已有库的功能。 最后,学习Groovy的最佳实践,如如何有效地利用元编程,何时使用静态类型以...

    Groovy和Grails配置方法

    ### Groovy和Grails配置方法 #### 一、Groovy与Grails简介 Groovy是一种强大的面向对象编程语言,它运行在Java平台上,并且能够直接与Java代码进行交互。Groovy支持函数式编程特性,拥有丰富的语法糖以及简洁的...

    Groovy Script 入门

    2. **动态添加方法**:可以在运行时动态添加方法到类或对象。 #### 五、总结 通过本文的介绍,我们了解到Groovy脚本作为一种强大的脚本语言,在Java平台上的应用十分广泛。无论是进行简单的脚本编写还是复杂的项目...

    groovy-api-chm

    5. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过MetaObjectProtocol (MOP) 实现的。例如,可以动态添加方法、属性,或者改变现有方法的行为。 6. **GDK(Groovy Development Kit)**:GDK是Groovy...

    groovy_demo

    - **类和对象**:Groovy支持类的定义和对象的创建,类可以有构造函数,继承和多态等特性。 - **元对象协议(MOP)**:Groovy的元对象协议允许在运行时扩展对象的行为。 - **类别(Category)**:类别可以为任何类...

    groovy基础语法.pdf

    在Groovy中,基本语法包括变量、属性、方法和闭包的定义,控制结构如if-else、for循环、while循环、switch语句,以及类和对象的操作等。 变量和数据类型: Groovy是动态类型语言,变量无需声明类型即可直接赋值使用...

    groovy 1.5.5 API

    7. **元对象协议(Meta-Object Protocol, MOP)**:Groovy的MOP是实现动态行为的关键,它允许在运行时扩展和修改类的行为。通过MOP,开发者可以实现动态方法、属性和操作。 8. **类别(Category)**:类别是一种...

    Java调用Groovy,实时动态加载数据库groovy脚本

    Groovy代码可以被Java编译器理解,并且在运行时,GroovyShell或GroovyClassLoader等工具能够即时编译和执行Groovy脚本,这为动态加载和执行提供了便利。 当我们需要在Java程序中调用Groovy脚本时,可以使用以下步骤...

    groovy

    5. 链式调用:对象属性和方法可以连续调用,如`object.property.method()`,增强了代码的可读性。 三、领域应用 1. 脚本和自动化:Groovy的简洁语法和动态特性使其在编写脚本和自动化任务中非常高效,例如持续集成...

    groovy api 资料 自学文档

    - `MetaClass`:Groovy的元编程允许在运行时修改类的行为,通过`metaClass`可以添加方法、属性等。 - 动态属性:Groovy对象可以随时添加或删除属性,无需预先定义。 6. **Groovy脚本和命令行执行**: - ...

    ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性

    【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 ) https://hanshuliang.blog.csdn.net/article/details/122815793 博客源码

    Groovy 动态修改XML

    3. **修改XML**:一旦找到需要修改的节点,Groovy提供了简单的方法来更新其属性、文本内容或者添加新的子节点。例如: ```groovy node.text = 'modified text' node.appendNode('newChild', 'new content') ``` ...

    groovy速查手册

    Groovy提供了丰富的API来操作运行时的对象模型,如使用反射来动态调用方法或获取对象的属性。 #### 七、实用技巧 - **命令行工具**:Groovy提供了一系列命令行工具,如`groovy`命令,用于执行Groovy脚本、评估...

    Groovy学习资料(包括Groovy in action 的中英文以及API)

    Groovy的API包含了各种内置类、方法和函数,覆盖了I/O、网络、并发、反射等多个方面。通过查阅这些文档,开发者可以快速找到解决特定问题的方法或组件。 学习Groovy不仅能够提升个人的编程效率,还有助于开发更具...

    groovy-binary-2.2.2.zip

    3. **元对象协议(MOP)**:Groovy的元对象协议允许在运行时修改类的行为,提供了强大的元编程能力。你可以添加方法、属性,甚至改变现有类的行为。 4. **GString**:Groovy的GString可以方便地进行字符串插值,类似...

Global site tag (gtag.js) - Google Analytics