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

Groovy动态改变对象能力(metaClass),第1张

概述引用一个官方例子swapCase来展示一下Groovy是如何增强既有类的能力的(演示如何使用delegate,注意演示的是final类:String) String.metaClass.swapCase = {->       def sb = new StringBuffer()       // delegate与this类似,引用当前正被‘改造’的对象       delegate.each

引用一个官方例子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

总结

以上是内存溢出为你收集整理的Groovy动态改变对象能力(metaClass)全部内容,希望文章能够帮你解决Groovy动态改变对象能力(metaClass)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1269440.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-08
下一篇2022-06-08

发表评论

登录后才能评论

评论列表(0条)

    保存