//元編程 /** * 只要實現了 GroovyInterceptable接口 * 調用所有方法時 都會先調用invokeMethod方法 */ /* class Person1 implements GroovyInterceptable{ def name def dream(){ System.out.println('i have a dream') } @Override Object invokeMethod(java.lang.String name, Object args) { System.out.println('invokeMethod') if(metaClass.invokeMethod(this,'respondsTo',name,args)){ metaClass.invokeMethod(this,name,null) }else{ System.out.println('沒實現') } } } def person = new Person1(name: 'name') person.dream() person.metaClass.invokeMethod(person,'dream',null) //調用dream方法 的3種方式 person.invokeMethod('dream',null) MetaMethod m = person.metaClass.getMetaMethod('dream',null) m.invoke(person,null) */ /** * 單例模式下通過重寫invokeMethod方法 對每個方法都進行同樣的判斷 * 方法攔截 */ /*class Mannager implements GroovyInterceptable{ static Mannager instance def isInit static Mannager getInstance(){ if(null == instance){ synchronized (Mannager.class){ if(null == instance){ instance = new Mannager() } } } return instance } def init(){ isInit = true } def dream(){ System.out.println('執行dream') } @Override Object invokeMethod(java.lang.String name, Object args) { if(name != 'init'){ if(!isInit){ System.out.println('請先執行inti方法') return } } if(metaClass.invokeMethod(this,'respondsTo',name,args)){ metaClass.invokeMethod(this,name,args) }else{ System.out.println('沒有這個方法') } } } Mannager.instance Mannager.instance.init() Mannager.instance.dream() */ /** * 1、在類的單個對象上進行方法攔截 * 2、在類上進行方法攔截 */ /* class Lin{ def dream(){ println('lin dream') } } //改變單個對象 def lin = new Lin() lin.dream() lin.metaClass.dream = { println('change dream') } lin.dream() new Lin().dream() //改寫invokeMethod 跟繼承GroovyInterceptable一樣 lin.metaClass.invokeMethod = { String name,Object args-> System.out.println('invoke') def method = delegate.metaClass.getMetaMethod(name,args) if(method){ method.invoke(delegate,args) } } lin.dream() //改變jdk裏的方法 String.metaClass.plus = { CharSequence i-> i } println( "123" + "abc") */ /** * 當方法和屬性沒有的話 會調用這些方法 */ class Man{ def propertyMissing(String name) { return null } def propertyMissing(String name, def arg) { } def methodMissing(String name, def args) { println('methdMissing') return 'meiyou' } def dream(){ println 'dream' } } def man = new Man() println(man.drea()) man.dream() //動態改變類中的方法實現 def scanner = new Scanner(System.in) Thread.start { while (true){ def msg = scanner.nextLine() if(msg == 'exit'){ break } if(man.respondsTo(msg)){ man."$msg"() }else{ def (name,body) = msg.split(':') man.metaClass."$name" = { evaluate(body) } } } }
groovy元編程 方法攔截 動態改變
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.