Groovy高效编程——动态改变对象的能力
? ? 来源:http://www.blogjava.net/BlueSUN/archive/2007/07/15/130318.html ? Groovy1.1beta-2开始,实现动态改变对象的能力变的十分简单:
class
?Person?{
????String?name }
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " }
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } def?person? = ? new ?Person(name: " 山风小子 " ) person.introduce()
I'm?山风小子
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } // ?添加性别属性,默认为男(Male) Person.metaClass.sex? = ? " Male " def?person? = ? new ?Person(name: " 山风小子 " ) person.introduce() println?person.sex
I'm?山风小子
Male
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } // ?添加性别属性,默认为男(Male) Person.metaClass.sex? = ? " Male " def?person? = ? new ?Person(name: " 山风小子 " ) person.introduce() println?person.sex // ?做变性手术,变为女的(Female) person.sex? = ? " Female " println?person.sex
I'm?山风小子
Male Female
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } // ?添加性别属性,默认为男(Male) Person.metaClass.sex? = ? " Male " // ?修改之前自我介绍行为,添加性别说明 Person.metaClass.introduce? << ?{println? " I'm?$name,?$sex " } def?person? = ? new ?Person(name: " 山风小子 " ) person.introduce() // ?做变性手术,变为女的(Female) person.sex? = ? " Female " person.introduce()
I'm?山风小子,?Male
I'm?山风小子,?Female
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } // ?添加性别属性,默认为男(Male) Person.metaClass.sex? = ? " Male " // ?修改之前自我介绍行为,添加性别说明 Person.metaClass.introduce? << ?{println? " I'm?$name,?$sex " } def?person? = ? new ?Person(name: " 山风小子 " ) person.introduce() // ?做变性手术,变为女的(Female) person.sex? = ? " Female " person.introduce() // ?工厂方法,造人方便点 Person.metaClass. ' static ' .createPerson? = ?{?name,?sex? -> ????Person?p? = ? new ?Person() ????p.name? = ?name ????p.sex? = ?sex ???? return ?p } def?bluesun? = ?Person.createPerson( " 山风小子 " ,? " Male " ) bluesun.introduce()
I'm?山风小子,?Female
I'm?山风小子,?Male
class
?Person?{
????String?name } // ?添加自我介绍的行为 Person.metaClass.introduce? << ?{println? " I'm?$name " } // ?添加性别属性,默认为男(Male) Person.metaClass.sex? = ? " Male " // ?修改之前自我介绍行为,添加性别说明 Person.metaClass.introduce? << ?{println? " I'm?$name,? " Male " ) bluesun.introduce() // ?方便实例化Person,添加一个构造方法 Person.metaClass.constructor? << ?{?name,?sex? -> ???? new ?Person(name:name,?sex:sex) } def?daniel? = ? new ?Person( " Daniel " ,? " Male " ) daniel.introduce()
I'm?山风小子,?Male
I'm?Daniel,?Male
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!
class
?Person?{
????String?name ???? public ?Person(name)?{ ???????? this .name? = ?name ????} ????def?introduce()?{ ????????println? " I'm?$name " ????} ????def?introduce(String?name)?{ ????????println? " She?is?$name " ????} } def?daniel? = ? new ?Person( ' Daniel ' ) // ?判断实例daniel是否有方法introduce() if ?(daniel.metaClass.respondsTo(daniel,? ' introduce ' ))?{ ????daniel.introduce() } // ?判断实例daniel是否有方法introduce(String) if ?(daniel.metaClass.respondsTo(daniel,? ' introduce ' ,?String))?{ ????daniel.introduce( ' Annie ' ) } // ?判断实例daniel是否有属性name if ?(daniel.metaClass.hasProperty(daniel,? ' name ' ))?{ ????println?daniel.name }
I'm?Daniel
She?is?Annie Daniel
class
?Person?{
????String?name ???? public ?Person(name)?{ ???????? this .name? = ?name ????} ????def?introduce()?{ ????????println? " I'm?$name " ????} ????def?introduce(String?name)?{ ????????println? " She?is?$name " ????} } Person.metaClass.methodMissing? = ?{?name,?args? -> ???? // ?动态添加方法 ????Person.metaClass. " $name " ? = ?{?methodArgs? -> ???????? if ?( " hello " .equals(name)) ????????????println? " $methodArgs " ???????? else ?{ ????????????def?argList? = ?Arrays.asList(methodArgs) ????????????println? " No?method?$name?with?${argList*.class} " ????????} ????} ???delegate. " $name " (args) } def?daniel? = ? new ?Person( ' Daniel ' ) daniel.hello( " Leona " ) daniel.hi( " Annie " ,? " Leona " )
{"Leona"}
No?method?hi?with?[class?java.lang.String,?class?java.lang.String]
class
?Person?{
????String?name ???? public ?Person(name)?{ ???????? this .name? = ?name ????} ????def?introduce()?{ ????????println? " I'm?$name " ????} ????def?introduce(String?name)?{ ????????println? " She?is?$name " ????} } Person.metaClass.propertyMissing? = ?{?String?name,?value? -> ???? // ?动态添加属性 ????Person.metaClass. " $name " ? = ?value } def?daniel? = ? new ?Person( ' Daniel ' ) daniel.sex? = ? ' Male ' println?daniel.sex
Male
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
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |