java動(dòng)態(tài)代理

目前動(dòng)態(tài)代理主要有兩種形式,jdk和cglib代理寻行,其中動(dòng)態(tài)代理是基于接口的代理媚创,而cglib是基于類的動(dòng)態(tài)代理。下邊就簡單寫兩個(gè)示例來簡單說一下這兩個(gè)代理:

jdk動(dòng)態(tài)代理

先定義一個(gè)接口,主接口


public interface Subject {

void request();

}

緊接著我們來定義一個(gè)java類來實(shí)現(xiàn)這個(gè)接口

public class RequestSubject implements Subject {

    @Override
    public void request() {

        System.out.println("------主題類----------");

    }

}

以上是被代理的接口和實(shí)現(xiàn)類,那么現(xiàn)在我們開始寫代理類膝藕,在被代理的類前后帶引一些語句,如下

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyDymic implements InvocationHandler{

    private Subject sub;
    
    public ProxyDymic(Subject sub){
        this.sub=sub;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        System.out.println("------開始代理---------");
        Object result=method.invoke(sub, args);
        System.out.println("------代理結(jié)束---------");
        
        return result;
    }

}

緊接著我們來寫測試類,看看效果

import java.lang.reflect.Proxy;

/**
 * 動(dòng)態(tài)代理測試
 * 
 * @author scorpion
 *
 */
public class ProxyTest {

    public static void main(String[] args) {
        // 創(chuàng)建委托對(duì)象
        RequestSubject sub = new RequestSubject();
        // 創(chuàng)建調(diào)用處理器對(duì)象
        ProxyDymic dymic = new ProxyDymic(sub);

        //動(dòng)態(tài)生成代理對(duì)象
        Subject subProxy = (Subject) Proxy.newProxyInstance(RequestSubject.class.getClassLoader(),
                RequestSubject.class.getInterfaces(), dymic);
        //通過代理對(duì)象調(diào)用方法
        subProxy.request();

    }
}

輸出結(jié)果如下:
------開始代理---------
------主題類----------
------代理結(jié)束---------
這里有些需要特別注意的點(diǎn),首先必須是接口類续誉,其次是我們的代理方法必須要實(shí)現(xiàn)invocationHandler,并且要重寫里邊的方法初肉,在這個(gè)方法里對(duì)被代理類進(jìn)行修飾或者是限制酷鸦。

cglib代理

先上代碼,緊接著我們?cè)趤斫忉?br> 首先要定義父類

public class Programer {

    public Programer(){}
    public void say(){
        System.out.println("我是一個(gè)程序員牙咏,我負(fù)責(zé)編程");
    }
}
import java.lang.reflect.Method;

import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class Hacker implements MethodInterceptor {

    @Override
    public Object intercept(Object obj, Method method, Object[] args, 
MethodProxy proxy) throws Throwable {

        System.out.println("hacker代理開始臼隔。。眠寿。躬翁。焦蘑。盯拱。。例嘱。");

        proxy.invokeSuper(obj, args);

        System.out.println("hacker代理結(jié)束狡逢。。拼卵。奢浑。。腋腮。雀彼。。");

        return null;
    }

}

測試類

import net.sf.cglib.proxy.Enhancer;

public class CGLibTest {

    public static void main(String[] args) {
        Programer p=new Programer();
        
        Hacker h=new Hacker();
        
        Enhancer en=new Enhancer();
        
        en.setSuperclass(p.getClass());
        
        en.setCallback(h);
        
        Programer proxy=(Programer)en.create();
        
        proxy.say();
    }
}

我們仔細(xì)看即寡,首先cglib是實(shí)現(xiàn)了對(duì)類的代理徊哑,另外我們的代理類必須是要實(shí)現(xiàn)MethodInterceptor,并且要重寫里邊的方法聪富,此外這里有個(gè)非常重要的類需要引起注意Enhancer類莺丑,它是鏈接唄代理類和代理類的橋梁,沒有它我們的代理就無法執(zhí)行墩蔓。
好了梢莽,這次就先介紹到這里,后邊會(huì)不上這些類的具體實(shí)現(xiàn)奸披,以及其背后的原理昏名。敬請(qǐng)期待。阵面。轻局。份殿。。嗽交。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末卿嘲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子夫壁,更是在濱河造成了極大的恐慌拾枣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盒让,死亡現(xiàn)場離奇詭異梅肤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)邑茄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門姨蝴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肺缕,你說我怎么就攤上這事左医。” “怎么了同木?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵浮梢,是天一觀的道長。 經(jīng)常有香客問我彤路,道長秕硝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任洲尊,我火速辦了婚禮远豺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坞嘀。我一直安慰自己躯护,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布姆吭。 她就那樣靜靜地躺著榛做,像睡著了一般。 火紅的嫁衣襯著肌膚如雪内狸。 梳的紋絲不亂的頭發(fā)上检眯,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音昆淡,去河邊找鬼锰瘸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛昂灵,可吹牛的內(nèi)容都是我干的避凝。 我是一名探鬼主播舞萄,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼管削!你這毒婦竟也來了倒脓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤含思,失蹤者是張志新(化名)和其女友劉穎崎弃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含潘,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡饲做,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遏弱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盆均。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖漱逸,靈堂內(nèi)的尸體忽然破棺而出泪姨,到底是詐尸還是另有隱情,我是刑警寧澤虹脯,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布驴娃,位于F島的核電站,受9級(jí)特大地震影響循集,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔗草,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一咒彤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧咒精,春花似錦镶柱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至范咨,卻和暖如春故觅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渠啊。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來泰國打工输吏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人替蛉。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓贯溅,卻偏偏與公主長得像拄氯,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子它浅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容