JDK動態代理,動態生成代理類。
阿新 • • 發佈:2017-11-01
loader equals pri out 接口 作用 emc throwable int
1.動態代理涉及到的類
(1) Java.lang.reflect.Proxy類,作用:動態生成代理類和對象
(2) Java.lang.reflect.InvocationHandler(處理器接口)
可以通過invoke方法實現對真實角色的代理訪問,每次通過Proxy生成代理類對象時都要指定處理器對象。
package com.xvl.proxy; /** * 接口:明星接口 * @author 1 * */ public interface Star { //面談 void confer(); //訂票 void bookTicket(); //唱歌void sing(); //收尾款 void collectMoney(); }
1 package com.xvl.proxy; 2 /** 3 * 真實類:真實明星 4 * @author 1 5 * 6 */ 7 public class RealStar implements Star { 8 9 @Override 10 public void confer() { 11 System.out.println("真實角色面談..."); 12 } 13 14 @Override 15 publicvoid bookTicket() { 16 System.out.println("真實角色訂票..."); 17 } 18 19 @Override 20 public void sing() { 21 System.out.println("真實角色唱歌..."); 22 } 23 24 @Override 25 public void collectMoney() { 26 System.out.println("真實角色收尾款..."); 27 } 28 29 }
1 packagecom.xvl.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler { 7 8 Star realstar; 9 10 public StarHandler(Star realstar) { 11 this.realstar = realstar; 12 } 13 14 /** 15 * 在invoke方法中實現對真實角色的控制 16 */ 17 @Override 18 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 System.out.println("********"); 20 method.invoke(realstar, args); 21 return null; 22 } 23 24 }
1 package com.xvl.proxy; 2 3 import java.lang.reflect.Proxy; 4 5 /** 6 * 測試類 7 * @author 1 8 * 9 */ 10 public class Test { 11 public static void main(String[] args) { 12 Star star = new RealStar(); 13 StarHandler starHandler = new StarHandler(star); 14 //創建代理類對象,newProxyInstance返回一個實現star接口的代理類對象 15 Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Star.class}, starHandler); 16 /* 17 * 此時便可以通過代理類操作 18 */ 19 proxy.bookTicket(); //代理對象調用方法會調用真實對象的方法 20 proxy.confer(); //代理對象調用方法會調用真實對象的方法 21 proxy.sing(); //代理對象調用方法會調用真實對象的方法 22 proxy.collectMoney(); //代理對象調用方法會調用真實對象的方法 23 } 24 }
運行結果如下:↓
********
真實角色訂票...
********
真實角色面談...
********
真實角色唱歌...
********
真實角色收尾款...
在invoke方法中實現對真實角色的控制 假如將invoke方法修改如下
1 package com.xvl.proxy; 2 3 import java.lang.reflect.InvocationHandler; 4 import java.lang.reflect.Method; 5 6 public class StarHandler implements InvocationHandler { 7 8 Star realstar; 9 10 public StarHandler(Star realstar) { 11 this.realstar = realstar; 12 } 13 14 /** 15 * 在invoke方法中實現對真實角色的控制 16 */ 17 @Override 18 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 Object object = null ; 20 System.out.println("********"); 21 if(method.getName().equals("sing")){ 22 object = method.invoke(realstar, args); 23 } 24 return object; 25 } 26 27 }
輸出結果如下:
********
********
********
真實角色唱歌...
********
invoke方法如何被調用不太清楚,正在探索中....
本人初學,如有錯誤,望指正。
JDK動態代理,動態生成代理類。