微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Groovy动态改变对象能力(metaClass)

引用一个官方例子swapCase来展示一下Groovy是如何增强既有类的能力的(演示如何使用delegate,注意演示的是final类:String)

String.MetaClass.swapCase = {->
      def sb 
= new StringBuffer()
      
// delegate与this类似,引用当前正被‘改造’的对象
      delegate.each {
           sb 
<< (Character.isUpperCase(it as char? Character.toLowerCase(it as char) : 
                   Character.toupperCase(it as 
char))
      }
      sb.toString()
}

String s 
= "Hello, world!"
println s.swapCase()

运行结果:

hELLO, WORLD!

说明:<<用于添加方法(如果方法已经存在,会发生groovy.lang.GroovyRuntimeException异常),=用于添加方法或覆盖既有方法

更加简洁的方法

String.MetaClass {
    
'static' {
        value 
= {
            it.toString()
        }
    }
    
    swapCase 
= { ->
      def sb 
= new StringBuffer()
      
// delegate与this类似,引用当前正被‘改造’的对象
      delegate.each {
           sb 
<< (Character.isUpperCase(it as char? Character.toLowerCase(it as char) : 
                   Character.toupperCase(it as 
char))
      }
      sb.toString()
    }
}

String s 
= 'Hello, world!'
println s.swapCase()
println String.value(
new Date())
运行结果:
hELLO, WORLD! Sun Jun 08 14:53:28 CST 2008

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐