日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

在程序運(yùn)行期,創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,對(duì)目標(biāo)對(duì)象中的方法進(jìn)行功能性增強(qiáng)的一種技術(shù); 它就是JVM中,對(duì)象方法的攔截器

write less do more!!

回顧OOP(面向?qū)ο缶幊蹋?/strong>

  • 三大特征:封裝、繼承和多態(tài)
  • 比如說(shuō),有Dog類、Cat類、Horse類,它們都有eat方法,run方法,按照OOP的編程思想,那么我們可以抽象出父類Animal,在父類中放置相同的屬性或者方法,這樣來(lái)避免多子類中重復(fù)的代碼。
  • 一切皆對(duì)象,很牛逼了,其實(shí)它有缺陷!
何為動(dòng)態(tài)代理?

 

OOP是縱向抽取和繼承體系,OOP很多場(chǎng)合都能夠解決我們的問(wèn)題【代碼重復(fù)問(wèn)題】,但是有一些場(chǎng)合,也有它處理不了的需要被解決的大量的代碼重復(fù)問(wèn)題。

1.1 什么是動(dòng)態(tài)代理?

==動(dòng)態(tài)代理就是,在程序運(yùn)行期,創(chuàng)建目標(biāo)對(duì)象的代理對(duì)象,并對(duì)目標(biāo)對(duì)象中的方法進(jìn)行功能性增強(qiáng)的一種技術(shù)==。在生成代理對(duì)象的過(guò)程中,目標(biāo)對(duì)象不變,代理對(duì)象中的方法是目標(biāo)對(duì)象方法的增強(qiáng)方法。可以理解為運(yùn)行期間,對(duì)象中方法的動(dòng)態(tài)攔截,在攔截方法的前后執(zhí)行功能操作。

代理類在程序運(yùn)行期間,創(chuàng)建的代理對(duì)象稱之為動(dòng)態(tài)代理對(duì)象。這種情況下,創(chuàng)建的代理對(duì)象,并不是事先在JAVA代碼中定義好的。而是在運(yùn)行期間,根據(jù)我們?cè)趧?dòng)態(tài)代理對(duì)象中的“指示”,動(dòng)態(tài)生成的。也就是說(shuō),你想獲取哪個(gè)對(duì)象的代理,動(dòng)態(tài)代理就會(huì)為你動(dòng)態(tài)的生成這個(gè)對(duì)象的代理對(duì)象。

動(dòng)態(tài)代理可以對(duì)被代理對(duì)象的方法進(jìn)行功能增強(qiáng)。有了動(dòng)態(tài)代理的技術(shù),那么就可以在不修改方法源碼的情況下,增強(qiáng)被代理對(duì)象的方法的功能,在方法執(zhí)行前后做任何你想做的事情。

創(chuàng)建代理對(duì)象的兩個(gè)方法:

//JDK動(dòng)態(tài)代理
Proxy.newProxyInstance(三個(gè)參數(shù));
//CGLib動(dòng)態(tài)代理
Enhancer.create(兩個(gè)參數(shù));

正常類創(chuàng)建對(duì)象的過(guò)程:

何為動(dòng)態(tài)代理?

 

動(dòng)態(tài)代理創(chuàng)建代理對(duì)象的過(guò)程:

何為動(dòng)態(tài)代理?

 

1.2 兩種常用的動(dòng)態(tài)代理方式

  1. 基于接口的動(dòng)態(tài)代理
  2. 提供者:JDK
  3. 使用JDK官方的Proxy類創(chuàng)建代理對(duì)象
  4. 注意:代理的目標(biāo)對(duì)象必須實(shí)現(xiàn)接口
  5. 基于類的動(dòng)態(tài)代理
  6. 提供者:第三方 CGLib
  7. 使用CGLib的Enhancer類創(chuàng)建代理對(duì)象
  8. 注意:如果報(bào) asmxxxx 異常,需要導(dǎo)入 asm.jar包
public class LogProxy {
    /**
     * 生成對(duì)象的代理對(duì)象,對(duì)被代理對(duì)象進(jìn)行所有方法日志增強(qiáng)
     * 參數(shù):原始對(duì)象
     * 返回值:被代理的對(duì)象
     * JDK 動(dòng)態(tài)代理
     *  基于接口的動(dòng)態(tài)代理
     *  被代理類必須實(shí)現(xiàn)接口
     *  JDK提供的
     */
    public static Object getObject(final Object obj){
        /**
         * 創(chuàng)建對(duì)象的代理對(duì)象
         * 參數(shù)一:類加載器
         * 參數(shù)二:對(duì)象的接口
         * 參數(shù)三:調(diào)用處理器,代理對(duì)象中的方法被調(diào)用,都會(huì)在執(zhí)行方法。對(duì)所有被代理對(duì)象的方法進(jìn)行攔截
         */
        Object proxyInstance = Proxy.newProxyInstance(obj.getClass().getClassLoader()
                , obj.getClass().getInterfaces(), new InvocationHandler() {
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //方法執(zhí)行前
                long startTime = System.currentTimeMillis();

                Object result = method.invoke(obj, args);//執(zhí)行方法的調(diào)用

                //方法執(zhí)行后
                long endTime = System.currentTimeMillis();
                SimpleDateFormat sdf = new SimpleDateFormat();
                System.out.printf(String.format("%s方法執(zhí)行結(jié)束時(shí)間:%%s ;方法執(zhí)行耗時(shí):%%d%%n"
                        , method.getName()), sdf.format(endTime), endTime - startTime);
                return result;
            }
        });
        return proxyInstance;
    }
    /**
     * 使用CGLib創(chuàng)建動(dòng)態(tài)代理對(duì)象
     * 第三方提供的的創(chuàng)建代理對(duì)象的方式CGLib
     * 被代理對(duì)象不能用final修飾
     * 使用的是Enhancer類創(chuàng)建代理對(duì)象
     */
    public static Object getObjectByCGLib(final Object obj){
        /**
         * 使用CGLib的Enhancer創(chuàng)建代理對(duì)象
         * 參數(shù)一:對(duì)象的字節(jié)碼文件
         * 參數(shù)二:方法的攔截器
         */
        Object proxyObj = Enhancer.create(obj.getClass(), new MethodInterceptor() {
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                //方法執(zhí)行前
                long startTime = System.currentTimeMillis();

                Object invokeObject = method.invoke(obj, objects);//執(zhí)行方法的調(diào)用

                //方法執(zhí)行后
                long endTime = System.currentTimeMillis();
                SimpleDateFormat sdf = new SimpleDateFormat();
                System.out.printf(String.format("%s方法執(zhí)行結(jié)束時(shí)間:%%s ;方法執(zhí)行耗時(shí):%%d%%n"
                        , method.getName()), sdf.format(endTime), endTime - startTime);
                return invokeObject;
            }
        });
        return proxyObj;
    }
}

分享到:
標(biāo)簽:代理 動(dòng)態(tài)
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定