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

Groovy探索之MOP 十五 方法名的动态性(2)

阅读更多

Groovy探索之MOP 十五 方法名的动态性(2

List scores = [new Student(no:'123',name:'Tom',chinScore:90,mathScore:99,englScore:60,physScore:88,chemScore:96)]

scores<<new Student(no:'124',name:'Mike',chinScore:88,mathScore:90,englScore:90,physScore:98,chemScore:87)

scores<<new Student(no:'125',name:'Alice',chinScore:100,mathScore:55,englScore:98,physScore:67,chemScore:56)

def sorter = new SortHelper(scores)

sorter.sortByChinScore()

scores.each{

println it.name

}

运行结果为:

Mike

Tom

Alice

我们都记得我们的初中数学里学过的对数的概念:对数里面有一个底的概念,比如我们在程序里把以2为底的对数写成如下的样子:

log28

即以2为底8的对数,这样,我们可以以任何一个自然数为底,但我们最常用的是以10为底的对数,即:

log10100

10为底的对数,我们通常写成:

lg100

问题为:我们在某种情况下,可能会计算以1100之间的任何一个数为底的对数。按照上面的分析,其实,就是我们需要给某个工具类100个计算对数的方法。

这就是方法名的动态性的使用了。

我们还是先给出这个工具类来:

class Util

{

}

这个工具类什么也都没有实现,留给我们在运行期内动态添加方法,如下:

(1..101).each{

int base->

Util.metaClass.'static'."log$base" = {

int n -> Math.log(n) / Math.log(base)

}

}

它是把1100进行遍历,产生了一百个方法,至于如何计算各个底的对数的方法,那是数学公式的问题,我们在这里不再详述。

有了上面的代码,我们现在就可以写测试代码了:

println Util.log20(400)

println Util.log100(100)

运行结果为:

2.0

1.0

现在,我们可以看到,我们的这些对数方法是不是写得很漂亮?

Groovy语言中,动态委派技术永远是我们最感兴趣的技术。而这种动态委派技术的实现,其实也需要用到我们使用ExpandoMetaClass类来实现的动态方法名。

下面就来说一说如何实现动态委派技术。

这是一个简单的委派类:

class Delegator {

private targetClass

private delegate

Delegator(targetClass, delegate) {

this.targetClass = targetClass

this.delegate = delegate

}

def delegate(String methodName) {

delegate(methodName, methodName)

}

def delegate(String methodName, String asMethodName) {

targetClass.metaClass."$asMethodName" = delegate.&"$methodName"

}

}

这个类十分的简单,可以明显的看到“delegate(String methodName, String asMethodName)”方法就是使用的ExpandoMetaClass类实现的动态方法名,如下:

targetClass.metaClass."$asMethodName" = delegate.&"$methodName"

现在,我们就来使用这个动态委派技术。

下面,我们有一个A类:

public class A{

def a()

{

println 'invoke a function...'

}

}

它就是我们需要委派的原始类。下面是一个简单的B类,没有任何的方法:

public class B{

}

下面就可以写测试代码了:

def a = new A()

def delegator = new Delegator(B,a)

delegator.delegate 'a'

delegator.delegate 'a','b'

delegator.delegate 'a','c'

def b = new B()

b.a()

b.b()

b.c()

在上面的代码中,我们分别把A类的“a”方法委派给了B类的三个方法:“a”、“b”和“c”方法。

最后,我们在B类对象中调用这三个方法。运行结果为:

invoke a function...

invoke a function...

invoke a function...

这充分的体现了使用的ExpandoMetaClass类实现的方法名的动态性的特点。

值得注意的是,上面的动态委派技术的实现,需要在我们的Groovy1.5及以上的版本中才能正常编译。可以确定的是,Groovy1.0版本是不能编译的。

同时需要说明的是,我的所有文字,除非注明需要Groovy1.5及以上版本,否则都可以在Groovy1.0版本及以上编译运行。

谢谢!

分享到:
评论

相关推荐

    Groovy MOP

    7. **代码热更新和热插拔**: 由于Groovy MOP的动态性,你可以在应用运行时修改类的行为,而无需重启应用。这对于快速迭代和调试非常有用,特别是在Grails这样的Web框架中,可以实现热更新控制器和服务类的代码。 在...

    groovy动态方法

    MOP使得Groovy具备了强大的灵活性和动态性,能够轻松实现一些在静态类型语言中难以实现的功能。 Groovy的动态方法和元编程对于开发工具、插件、脚本等场景尤其有用,可以极大地提高开发效率和代码的可扩展性。例如...

    groovy 1.5.5 API

    总之,Groovy 1.5.5 API文档是开发者理解并有效使用Groovy语言的重要资源,它涵盖了语言的基本概念、核心类库、动态性以及与其他Java技术的交互。通过深入学习这个API,开发者能够充分利用Groovy的灵活性和生产力...

    实战groovy.rar

    进一步探索Groovy的高级特性,如Meta Object Protocol (MOP)、GroovyShell、 Grape依赖管理系统等,提升编程技巧。 七、社区资源与工具 积极参与Groovy社区,利用官方文档、Stack Overflow、Groovy Slack等平台获取...

    groovy-api-chm

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

    groovy_demo

    - **元对象协议(MOP)**:Groovy的元对象协议允许在运行时扩展对象的行为。 - **类别(Category)**:类别可以为任何类添加方法,提供一种便捷的扩展机制。 4. **Groovy的脚本支持**: - **脚本执行**:Groovy...

    Groovy and Grails Recipes.pdf

    - **动态性**:Groovy支持动态类型系统,可以在运行时改变变量的类型。 - **简洁性**:Groovy简化了许多Java中的冗余语法,如无需显式声明变量类型。 - **扩展性**:Groovy允许开发者通过元编程来扩展现有类的...

    Groovy入门经典.pdf

    4. **元编程**:Groovy允许在运行时修改类和对象的行为,这是通过元对象协议(Meta Object Protocol, MOP)实现的。元编程为动态扩展和定制对象提供了可能。 5. **GString**:Groovy的GString可以方便地进行字符串...

    groovy经典入门

    `ExpandoMetaClass`允许动态添加方法到类,`MetaObjectProtocol (MOP)`则提供了访问和改变对象行为的机制。 7. **AST转换**:Groovy的抽象语法树(AST)转换允许开发者在编译时修改源代码,实现自定义的编程特性。 8...

    groovy-binary-2.2.2.zip

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

    Groovy IN ACTION

    这一部分会涵盖MetaObjectProtocol (MOP) 和类别(Category)的概念,以及动态方法添加、属性注入等技巧。 4. **Grails框架**:Groovy与Web开发紧密相连,Grails是一个基于Groovy的全栈式开发框架,它简化了Spring...

    java与groovy互相调用1

    2. **动态性**:Groovy支持动态类型,允许在运行时更改对象行为。 3. **兼容性**:可以直接使用Java库和API,无需任何额外的桥接或适配器。 4. **灵活性**:在需要的地方引入Groovy,可以利用其脚本语言的灵活性,而...

    Introduction to Groovy

    此外,Groovy还支持元对象协议(MOP),允许开发者对对象的行为进行定制化扩展,从而实现了更为灵活的对象交互方式。 ##### 轻松的脚本语法 Groovy提供了可选的分号、括号以及类声明(对于脚本而言),这让脚本编写...

    groovy 学习gradle学习经典手册

    4. **元编程**:理解Groovy如何通过元对象协议(Meta Object Protocol, MOP)提供元编程能力,允许在运行时动态修改类和对象的行为。 5. **Grails框架**:如果时间允许,可以扩展到Groovy在Web开发中的应用,如...

    groovy

    受Smalltalk和Lisp启发,Groovy引入了Meta-Object Protocol(MOP),允许在运行时拦截方法调用和属性访问。通过元类,我们可以为现有的类添加新的行为。例如,下面的代码展示了如何使用Expando-MOP为Integer类添加`...

    Eclipse开发Groovy插件

    在开发Groovy插件时,还需要关注Groovy语言的特性,如闭包、动态类型、元对象协议(MOP)等,以及如何与Eclipse的Java开发工具(JDT)集成。例如,你可以利用Groovy的AST(抽象语法树)转换来增强代码的自动完成和...

    IBM 实战 Groovy

    9. **元编程(MOP)**: Groovy的元编程能力非常强大,可以通过反射等方式动态地修改类的行为。 #### 五、Groovy的未来 随着Groovy的不断发展和完善,它已经成为Java平台上不可或缺的一部分。Groovy不仅仅是一种编程...

Global site tag (gtag.js) - Google Analytics