1. 程式人生 > >JDK動態代理,動態生成代理類。

JDK動態代理,動態生成代理類。

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     public
void 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 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 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動態代理,動態生成代理類。