大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專(zhuān)注Java教育14年 全國(guó)咨詢/投訴熱線:400-8080-105
動(dòng)力節(jié)點(diǎn)LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁(yè) hot資訊 Java動(dòng)態(tài)代理模式詳解

Java動(dòng)態(tài)代理模式詳解

更新時(shí)間:2022-08-09 10:04:04 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1820次

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

代理類(lèi)在程序運(yùn)行時(shí)創(chuàng)建代理的方式叫Java動(dòng)態(tài)代理模式,也就是說(shuō)代理類(lèi)并不是在java代碼中定義的,而是在運(yùn)行的時(shí)候動(dòng)態(tài)生成的

動(dòng)態(tài)代理有以下特點(diǎn):

1.代理對(duì)象不需要實(shí)現(xiàn)接口

2.代理對(duì)象的生成使用JDK API在內(nèi)存中動(dòng)態(tài)構(gòu)建代理對(duì)象(我們需要指定代理的接口object/target object implements Type)

3.動(dòng)態(tài)代理也叫:JDK代理、接口代理

JDK中生成代理對(duì)象的API代理類(lèi)的封裝:java.lang.reflect.Proxy JDK實(shí)現(xiàn)代理只需要使用newProxyInstance方法,但是該方法需要接收三個(gè)參數(shù)。完整的寫(xiě)作是:

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

注意這個(gè)方法是Proxy類(lèi)中的靜態(tài)方法,接收的三個(gè)參數(shù)依次是:

類(lèi)加載器加載器: 指定當(dāng)前目標(biāo)對(duì)象使用類(lèi)加載器,獲取加載器的方法固定

類(lèi)[] 接口:目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型,使用泛型方法確認(rèn)類(lèi)型

調(diào)用處理程序 h:事件處理,當(dāng)目標(biāo)對(duì)象的方法被執(zhí)行時(shí),會(huì)觸發(fā)事件處理器的方法,將當(dāng)前執(zhí)行的目標(biāo)對(duì)象的方法作為參數(shù)傳入

代碼示例:接口類(lèi)IUserDao.java和接口實(shí)現(xiàn)類(lèi),目標(biāo)對(duì)象UserDao相同,無(wú)需修改。在此基礎(chǔ)上添加一個(gè)代理工廠類(lèi)(ProxyFactory.java),在這個(gè)地方寫(xiě)代理類(lèi),然后測(cè)試類(lèi)(需要使用代理的代碼)首先建立目標(biāo)對(duì)象和代理對(duì)象的連接,然后替換代理對(duì)象中的同名方法

代理工廠類(lèi):ProxyFactory.java

/** * 創(chuàng)建動(dòng)態(tài)代理對(duì)象 * 動(dòng)態(tài)代理不需要實(shí)現(xiàn)接口,但是需要指定接口類(lèi)型 */
public class ProxyFactory{
    //維護(hù)一個(gè)目標(biāo)對(duì)象
    private Object target;
    public ProxyFactory(Object target){
        this.target=target;
    }
   //給目標(biāo)對(duì)象生成代理對(duì)象
    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("開(kāi)始事務(wù)2");
                        //執(zhí)行目標(biāo)對(duì)象方法
                        Object returnValue = method.invoke(target, args);
                        System.out.println("提交事務(wù)2");
                        return returnValue;
                    }
                }
        );
    }
}

測(cè)試類(lèi):App.java

/** * 測(cè)試類(lèi) */
public class App {
    public static void main(String[] args) {
        //目標(biāo)對(duì)象
        IUserDao target = new UserDao();
        //【原始的類(lèi)型 class cn.itcast.b_dynamic.UserDao】
        System.out.println(target.getClass());
        //給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象
        IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
        //class $Proxy0   內(nèi)存中動(dòng)態(tài)生成的代理對(duì)象
        System.out.println(proxy.getClass());
        //執(zhí)行方法   【代理對(duì)象】
        proxy.save();
    }
}

總結(jié):代理對(duì)象不需要實(shí)現(xiàn)接口,但目標(biāo)對(duì)象必須實(shí)現(xiàn)接口,否則無(wú)法使用動(dòng)態(tài)代理。如果大家想了解更多相關(guān)知識(shí),可以關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java設(shè)計(jì)模式,里面有更豐富的知識(shí)等著大家去學(xué)習(xí),希望對(duì)大家能夠有所幫助。

提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)

  • 全國(guó)校區(qū) 2025-04-24 搶座中
  • 全國(guó)校區(qū) 2025-05-15 搶座中
  • 全國(guó)校區(qū) 2025-06-05 搶座中
  • 全國(guó)校區(qū) 2025-06-26 搶座中
免費(fèi)課程推薦 >>
技術(shù)文檔推薦 >>
主站蜘蛛池模板: 免费观看一级特黄欧美大片 | 国产高清天干天天视频 | 色偷偷亚洲第一综合 | 俄罗斯老妇性欧美毛茸茸孕交 | 久久99热成人精品国产 | 国产精品区一区二区三 | 亚洲日本va中文字幕在线不卡 | 久久久久综合网 | 国产精品二区在线 | 福利一区在线观看 | 99亚洲乱人伦精品 | 狠狠色狠狠色综合网 | 色老头一区二区三区 | 奇米影视亚洲春色77777 | 成人国产在线看不卡 | 色在线国产 | 久久精品国产第一区二区 | 久久综久久美利坚合众国 | a网在线 | 国产精品亚洲一区二区在线观看 | 成人久久精品 | 欧美性禁片在线观看 | 国产亚洲一区二区麻豆 | 99爱在线视频这里只有精品 | 国产日韩欧美亚洲综合在线 | 久久精品免视看国产陈冠希 | 亚洲另类精品综合 | 日产一一到六区麻豆 | 99热这里只有精品在在 | 久久国产首页 | 看全色黄大色大片免费久黄久 | 日日摸夜夜爽夜夜爽出水 | 亚洲精品中文字幕一区 | 青娱乐国产在线视频 | 欧美日韩国产在线人成 | 成人在线观看网站 | 中文字幕在线一区二区三区 | 色综合久久久久久久久五月 | 国产精品久久免费视频 | 日本一级大毛片a一 | 亚洲成a人片毛片在线 |