程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> JAVA動態代理模式(從現實生活角度理解代碼原理),java動態

JAVA動態代理模式(從現實生活角度理解代碼原理),java動態

編輯:JAVA綜合教程

JAVA動態代理模式(從現實生活角度理解代碼原理),java動態


所謂動態代理,即通過代理類:Proxy的代理,接口和實現類之間可以不直接發生聯系,而可以在運行期(Runtime)實現動態關聯。

java動態代理主要是使用java.lang.reflect包中的兩個類。

InvocationHandler類

public Object invoke(Object obj,Method method,Object[] obs) 

其中第一個參數 obj 指的是代理類,method是被代理的方法,obs是指被代理的方法的參數組。此方法由代理類來實現。

Proxy類

protectedProxy(InvocationHandler h);

staticClass getProxyClass(ClassLoader loader,Class[] interfaces);

staticObject newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandlerh);

動態代理其實是在運行時生成class,所以,我們必須提供一組interface,然後告訴他class已經實現了這些interface,而且在生成Proxy的時候,必須給他提供一個handler,讓他來接管實際的工作。

同樣的在開始代碼實現之前,我們還是要講一下關於鏈家的故事,之前靜態代理模式中提到鏈家(接口)有賣二手房的業務,公司有一大批售房精英(靜態代理),但現在互聯網金融這塊發展勢頭迅猛,鏈家也想插一腳進去,但苦於沒有相關人才(代理)儲備,這時公司便有了從相關的人才市場(動態代理“工廠”)尋找專業人才實現此類業務的想法,人才市場,顧名思義,就是根據企業(接口)的某種需求(被代理的方法)尋找有相關技能的人才。下面開始動態代理的實現代碼:

第一步:LianJia提供房屋買賣以及互聯網貸款渠道方法(接口)

1 interface LianJia {
2     public void sellHouse();
3     public void loan();
4 }

第二步:我們的房主不僅要賣房也要貸款做其他事情(市場需求)奮斗得知鏈家有這個業務所以他又找到了鏈家(被代理對象)

 1 public class HouseMaster implements LianJia {
 2     @Override
 3     public void sellHouse() {
 4         System.out.println("我有房子要賣");
 5     }
 6     @Override
 7     public void loan() {
 8         System.out.println("我要貸款做生意");
 9     }
10 }

第三步:這裡是浩瀚的人才市場,你想要的這裡都有(生成動態代理的類)

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class CreatProxy implements InvocationHandler{
    //聲明被代理對象(之所以用Object是因為他在Java中是所有類包含自定義類的超類)
    private Object target;
    //創建代理對象(根據被代理對象需求)
    public Object bind(Object target){
        this.target = target;
        //使用Proxy類創建一個動態代理對象
        Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
    //具體執行業務的方法
        /**
         * proxy: 代理類對象
         * method:被代理對象的方法
         * args:被代理對象方法的參數
         */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        //調用業務方法
        method.invoke(target);
        return null;
    }
}

第四步:實現測試類

public class Test {
    public static void main(String[] args) {
        HouseMaster hm = new HouseMaster();
        CreatProxy cp = new CreatProxy();
        LianJia lj = (LianJia) cp.bind(hm);
        lj.sellHouse();
        lj.loan();
    }
}

我們也發現從靜態代理到動態代理整個過程中發現,被代理對象(市場需求)會隨時變化,企業(接口)也必須啟用動態代理模式才可應對市場變化(個人認為富士康就屬於一個大的電子類動態代理工廠,而蘋果谷歌等企業則為市場需求的締造者與規則(接口)的)。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved