最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射的應(yīng)用之動(dòng)態(tài)代理深入理解

 更新時(shí)間:2021年09月13日 10:21:58   作者:威斯布魯克.猩猩  
這篇文章主要介紹了Java反射的應(yīng)用之動(dòng)態(tài)代理深入理解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、代理模式的引入

靜態(tài)代理舉例
特點(diǎn):代理類和被代理類在編譯期間,就確定下來(lái)了。

interface ClothFactory{
    void produceCloth();
}
//代理類
class ProxyClothFactory implements ClothFactory{
    private ClothFactory factory;//用被代理類對(duì)象進(jìn)行實(shí)例化
    public ProxyClothFactory(ClothFactory factory){
        this.factory = factory;
    }
    @Override
    public void produceCloth() {
        System.out.println("代理工廠做一些準(zhǔn)備工作");
        factory.produceCloth();
        System.out.println("代理工廠做一些后續(xù)的收尾工作");
    }
}
//被代理類
class NikeClothFactory implements ClothFactory{
 
    @Override
    public void produceCloth() {
        System.out.println("Nike工廠生產(chǎn)一批運(yùn)動(dòng)服");
    }
}
public class StaticProxyTest {
    public static void main(String[] args) {
        //創(chuàng)建被代理類的對(duì)象
        NikeClothFactory nike = new NikeClothFactory();
        //創(chuàng)建代理類的對(duì)象
        ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike);
        proxyClothFactory.produceCloth();
    }

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

動(dòng)態(tài)代理的舉例

interface Human{
    String getBelief();
    void eat(String food);
}
//被代理類
class SuperMan implements Human{
    @Override
    public String getBelief() {
        return "I believe I can fly!";
    }
 
    @Override
    public void eat(String food) {
        System.out.println("我喜歡吃" + food);
    }
}
class HumanUtil{
    public void method1(){
        System.out.println("===================通用方法一===============================");
    }
    public void method2(){
        System.out.println("===================通用方法二===============================");
    }
}
/*
要想實(shí)現(xiàn)動(dòng)態(tài)代理,需要解決的問(wèn)題?
問(wèn)題一:如何根據(jù)加載到內(nèi)存中的被代理類,動(dòng)態(tài)的創(chuàng)建一個(gè)代理類及其對(duì)象。
問(wèn)題二:當(dāng)通過(guò)代理類的對(duì)象調(diào)用方法a時(shí),如何動(dòng)態(tài)的去調(diào)用被代理類中的同名方法a。
 */
class ProxyFactory{
    //調(diào)用此方法,返回一個(gè)代理類的對(duì)象。解決問(wèn)題一
    public static Object getProxyInstance(Object obj){//obj:被代理類的對(duì)象
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}
class MyInvocationHandler implements InvocationHandler{
    private Object obj;//需要使用被代理類的對(duì)象進(jìn)行賦值
    public void bind(Object obj){
        this.obj = obj;
    }
    //當(dāng)我們通過(guò)代理類的對(duì)象,調(diào)用方法a時(shí),就會(huì)自動(dòng)的調(diào)用如下的方法:invoke()
    //將被代理類要執(zhí)行的方法a的功能就聲明在invoke()中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
 
        HumanUtil util = new HumanUtil();
        util.method1();
        //method:即為代理類對(duì)象調(diào)用的方法,此方法也就作為了被代理類對(duì)象要調(diào)用的方法
        //obj:被代理類的對(duì)象
        Object returnValue = method.invoke(obj,args);
 
        util.method2();
        //上述方法的返回值就作為當(dāng)前類中的invoke()的返回值。
        return returnValue;
    }
}
public class ProxyTest{
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
        //當(dāng)通過(guò)代理類對(duì)象調(diào)用方法時(shí),會(huì)自動(dòng)的調(diào)用被代理類中同名的方法
        String belief = proxyInstance.getBelief();
        System.out.println(belief);
        proxyInstance.eat("四川麻辣燙");
        System.out.println("************************************************");
        NikeClothFactory nikeClothFactory = new NikeClothFactory();
        ClothFactory proxyClothFactory = (ClothFactory) ProxyFactory.getProxyInstance(nikeClothFactory);
        proxyClothFactory.produceCloth();
    }

到此這篇關(guān)于Java反射的應(yīng)用之動(dòng)態(tài)代理深入理解的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程池的四種拒絕策略詳解

    Java線程池的四種拒絕策略詳解

    jdk1.5 版本新增了JUC并發(fā)編程包,極大的簡(jiǎn)化了傳統(tǒng)的多線程開(kāi)發(fā),下面這篇文章主要介紹了Java線程池的四種拒絕策略的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解解讀

    SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解解讀

    這篇文章主要介紹了SpringBoot對(duì)靜態(tài)資源的映射規(guī)則詳解解讀,在Spring Boot中,映射規(guī)則是用來(lái)定義URL與控制器方法之間的映射關(guān)系的,通過(guò)映射規(guī)則,可以將特定的URL請(qǐng)求映射到相應(yīng)的控制器方法上,從而實(shí)現(xiàn)請(qǐng)求的處理和響應(yīng)的返回,需要的朋友可以參考下
    2023-10-10
  • 詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法

    詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法

    這篇文章主要介紹了詳解Springboot 優(yōu)雅停止服務(wù)的幾種方法 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 如何在SpringBoot中添加攔截器忽略請(qǐng)求URL當(dāng)中的指定字符串

    如何在SpringBoot中添加攔截器忽略請(qǐng)求URL當(dāng)中的指定字符串

    這篇文章主要介紹了在SpringBoot中添加攔截器忽略請(qǐng)求URL當(dāng)中的指定字符串,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果

    SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果

    這篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)并發(fā)任務(wù)并返回結(jié)果問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java @RequestMapping注解功能使用詳解

    Java @RequestMapping注解功能使用詳解

    通過(guò)@RequestMapping注解可以定義不同的處理器映射規(guī)則,下面這篇文章主要給大家介紹了關(guān)于SpringMVC中@RequestMapping注解用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Java行為型設(shè)計(jì)模式之策略模式詳解

    Java行為型設(shè)計(jì)模式之策略模式詳解

    策略模式屬于Java-設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換。本文將通過(guò)示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-11-11
  • Java 如何使用JDBC連接數(shù)據(jù)庫(kù)

    Java 如何使用JDBC連接數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Java 如何使用JDBC連接數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    MyBatis-Plus是基于MyBatis的持久層增強(qiáng)工具,提供簡(jiǎn)化CRUD、代碼生成器、條件構(gòu)造器、分頁(yè)及樂(lè)觀鎖等功能,極大簡(jiǎn)化了開(kāi)發(fā)工作量并提高了開(kāi)發(fā)效率,本文就來(lái)介紹一下SpringBoot+MyBatis-Plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐,感興趣的可以了解一下
    2024-11-11
  • java時(shí)間戳與日期相互轉(zhuǎn)換工具詳解

    java時(shí)間戳與日期相互轉(zhuǎn)換工具詳解

    這篇文章主要為大家詳細(xì)介紹了java各種時(shí)間戳與日期之間相互轉(zhuǎn)換的工具,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12

最新評(píng)論

禹州市| 阳高县| 无锡市| 温宿县| 石门县| 滦平县| 吴堡县| 仁布县| 广水市| 广灵县| 福泉市| 定远县| 泾源县| 崇明县| 浪卡子县| 三台县| 榆树市| 个旧市| 马鞍山市| 北京市| 五大连池市| 吴川市| 鄂托克前旗| 新津县| 隆尧县| 忻城县| 那坡县| 曲松县| 青海省| 祥云县| 沾益县| 耒阳市| 泌阳县| 上饶市| 铁岭市| 安达市| 长阳| 麦盖提县| 泸州市| 鹤山市| 凤城市|