Java的三種代理模式(二)

.動態(tài)代理

動態(tài)代理有以下特點:
1.代理對象,不需要實現(xiàn)接口
2.代理對象的生成,是利用JDK的API,動態(tài)的在內(nèi)存中構(gòu)建代理對象(需要我們指定創(chuàng)建代理對象/目標(biāo)對象實現(xiàn)的接口的類型)
3.動態(tài)代理也叫做:JDK代理,接口代理

JDK中生成代理對象的API

代理類所在包:java.lang.reflect.Proxy
JDK實現(xiàn)代理只需要使用newProxyInstance方法,但是該方法需要接收三個參數(shù),完整的寫法是:

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )

注意該方法是在Proxy類中是靜態(tài)方法,且接收的三個參數(shù)依次為:

  • ClassLoader loader,:指定當(dāng)前目標(biāo)對象使用類加載器,獲取加載器的方法是固定的
  • Class<?>[] interfaces,:目標(biāo)對象實現(xiàn)的接口的類型,使用泛型方式確認類型
  • InvocationHandler h:事件處理,執(zhí)行目標(biāo)對象的方法時,會觸發(fā)事件處理器的方法,會把當(dāng)前執(zhí)行目標(biāo)對象的方法作為參數(shù)傳入

代碼示例:

接口類IUserDao.java以及接口實現(xiàn)類,目標(biāo)對象UserDao是一樣的,沒有做修改.在這個基礎(chǔ)上,增加一個代理工廠類(ProxyFactory.java),將代理類寫在這個地方,然后在測試類(需要使用到代理的代碼)中先建立目標(biāo)對象和代理對象的聯(lián)系,然后代用代理對象的中同名方法
代理工廠類:ProxyFactory.java

/**
 * 創(chuàng)建動態(tài)代理對象
 * 動態(tài)代理不需要實現(xiàn)接口,但是需要指定接口類型
 */
public class ProxyFactory{

    //維護一個目標(biāo)對象
    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }

   //給目標(biāo)對象生成代理對象
    public Object getProxyInstance(){
        return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("開始事務(wù)2");
                        //執(zhí)行目標(biāo)對象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("提交事務(wù)2");
                        return returnValue;
                    }
                }
        );
    }

}

測試類:App.java

/**
 * 測試類
 */
public class App {
    public static void main(String[] args) {
        // 目標(biāo)對象
        IUserDao target = new UserDao();
        // 【原始的類型 class cn.itcast.b_dynamic.UserDao】
        System.out.println(target.getClass());

        // 給目標(biāo)對象纠亚,創(chuàng)建代理對象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        // class $Proxy0   內(nèi)存中動態(tài)生成的代理對象
        System.out.println(proxy.getClass());

        // 執(zhí)行方法   【代理對象】
        proxy.save();
    }
}

總結(jié):

代理對象不需要實現(xiàn)接口,但是目標(biāo)對象一定要實現(xiàn)接口,否則不能用動態(tài)代理

歡迎加入學(xué)習(xí)交流群569772982骗随,大家一起學(xué)習(xí)交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末稚瘾,一起剝皮案震驚了整個濱河市牡昆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌摊欠,老刑警劉巖丢烘,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異些椒,居然都是意外死亡播瞳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門免糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赢乓,“玉大人,你說我怎么就攤上這事石窑∨朴螅” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵松逊,是天一觀的道長躺屁。 經(jīng)常有香客問我,道長经宏,這世上最難降的妖魔是什么犀暑? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮烁兰,結(jié)果婚禮上耐亏,老公的妹妹穿的比我還像新娘。我一直安慰自己缚柏,他們只是感情好苹熏,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般轨域。 火紅的嫁衣襯著肌膚如雪袱耽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天干发,我揣著相機與錄音朱巨,去河邊找鬼。 笑死枉长,一個胖子當(dāng)著我的面吹牛冀续,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播必峰,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洪唐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吼蚁?” 一聲冷哼從身側(cè)響起凭需,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肝匆,沒想到半個月后粒蜈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡旗国,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年枯怖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能曾。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡度硝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寿冕,到底是詐尸還是另有隱情塘淑,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布蚂斤,位于F島的核電站,受9級特大地震影響槐沼,放射性物質(zhì)發(fā)生泄漏曙蒸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一岗钩、第九天 我趴在偏房一處隱蔽的房頂上張望纽窟。 院中可真熱鬧,春花似錦兼吓、人聲如沸臂港。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽审孽。三九已至县袱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佑力,已是汗流浹背式散。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留打颤,地道東北人暴拄。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像编饺,于是被迫代替她去往敵國和親乖篷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法透且,類相關(guān)的語法撕蔼,內(nèi)部類的語法,繼承相關(guān)的語法石蔗,異常的語法罕邀,線程的語...
    子非魚_t_閱讀 31,638評論 18 399
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司养距,掛了不少诉探,但最終還是拿到小米、百度棍厌、阿里肾胯、京東、新浪耘纱、CVTE敬肚、樂視家的研發(fā)崗...
    時芥藍閱讀 42,251評論 11 349
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)束析,斷路器艳馒,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 昨天布置了一篇小練筆,續(xù)寫《中彩那天》员寇。這篇文章是一個經(jīng)典故事弄慰,發(fā)生在一個窮苦的汽車修理工之家。 父親和同事庫伯一...
    燕麥文話閱讀 812評論 4 8
  • 最近看了海天電商金融研究中心出版的《玩轉(zhuǎn)大數(shù)據(jù)》這本書蝶锋,全書用流程圖呈現(xiàn)海量內(nèi)容陆爽,燒腦,但這種方式呈現(xiàn)內(nèi)容覺得挺有...
    瑜ba閱讀 325評論 0 0