1. 程式人生 > >動態代理初識

動態代理初識

參數 描述 pre 方法 靜態代理 方法體 system rri 接口

代理模式
* 概念:
  1. 真實對象:被代理的對象
  2. 代理對象:
  3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的
* 實現方式:
  1. 靜態代理:有一個類文件描述代理模式
  2. 動態代理:在內存中形成代理類
* 實現步驟:
  1. 代理對象和真實對象實現相同的接口
  2. 代理對象 = Proxy.newProxyInstance();
  3. 使用代理對象調用方法。
  4. 增強方法

* 增強方式:
  1. 增強參數列表
  2. 增強返回值類型
  3. 增強方法體執行邏輯

public class ProxyTest {

    public static void main(String[] args) {
        //1.創建真實對象
        Lenovo lenovo = new Lenovo();
        
        //2.動態代理增強lenovo對象
        /*
            三個參數:
                1. 類加載器:真實對象.getClass().getClassLoader()
                2. 接口數組:真實對象.getClass().getInterfaces()
                3. 處理器:new InvocationHandler()
         
*/ SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() { /* 代理邏輯編寫的方法:代理對象調用的所有方法都會觸發該方法執行 參數: 1. proxy:代理對象 2. method:代理對象調用的方法,被封裝為的對象 3. args:代理對象調用的方法時,傳遞的實際參數
*/ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /*System.out.println("該方法執行了...."); System.out.println(method.getName()); System.out.println(args[0]); */ //判斷是否是sale方法 if(method.getName().equals("sale")){ //1.增強參數 double money = (double) args[0]; money = money * 0.85; System.out.println("專車接你...."); //使用真實對象調用該方法 String obj = (String) method.invoke(lenovo, money); System.out.println("免費送貨..."); //2.增強返回值 return obj+"_鼠標墊"; }else{ Object obj = method.invoke(lenovo, args); return obj; } } }); //3.調用方法 /* String computer = proxy_lenovo.sale(8000); System.out.println(computer);*/ proxy_lenovo.show(); } }

動態代理初識