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

淺析Java中靜態(tài)代理和動(dòng)態(tài)代理的應(yīng)用與區(qū)別

 更新時(shí)間:2023年08月25日 16:13:59   作者:雙木林啊  
代理模式在我們生活中很常見,而Java中常用的兩個(gè)的代理模式就是動(dòng)態(tài)代理與靜態(tài)代理,這篇文章主要為大家介紹了二者的應(yīng)用與區(qū)別,需要的可以參考下

一、靜態(tài)代理

1、靜態(tài)代理引入

代理模式在我們生活中很常見,比如我們購(gòu)物,可以從生產(chǎn)工廠直接進(jìn)行購(gòu)物,但是在生活中往往不是這樣,一般都是廠家委托給超市進(jìn)行銷售,而我們不直接跟廠家進(jìn)行關(guān)聯(lián),這其中就引用了靜態(tài)代理的思想,廠家相當(dāng)于真實(shí)角色,超市相當(dāng)于代理角色,我們則是目標(biāo)角色。代理角色的作用其實(shí)就是,幫助真實(shí)角色完成一些事情,在真實(shí)角色業(yè)務(wù)的前提下,還可以增加其他的業(yè)務(wù)。AOP切面編程就是運(yùn)用到了這一思想。

2、靜態(tài)代理案例

寫一個(gè)小小的案例,通過(guò)婚慶公司,來(lái)實(shí)現(xiàn)靜態(tài)代理

/**
 * @ClassName StaticProxy
 * @Description TODO 靜態(tài)代理(模擬婚慶公司實(shí)現(xiàn))
 * @Author ZhangHao
 * @Date 2022/12/11 11:38
 * @Version: 1.0
 */
public class StaticProxy {
    public static void main(String[] args) {
        Marry marry = new WeddingCompany(new You());
        marry.happyMarry();
        //注意:真實(shí)對(duì)象和代理對(duì)象要實(shí)現(xiàn)同一個(gè)接口
    }
}
//結(jié)婚
interface Marry{
    //定義一個(gè)結(jié)婚的接口
    void happyMarry();
}
//你(真實(shí)角色)
class You implements Marry{
    @Override
    public void happyMarry() {
        System.out.println("張三結(jié)婚了!");
    }
}
//婚慶公司(代理角色)
class WeddingCompany implements Marry{
    //引入真實(shí)角色
    private Marry target;
    public WeddingCompany(Marry target){
        this.target = target;
    }
    @Override
    public void happyMarry() {
        //在結(jié)婚前后增加業(yè)務(wù)
        before();
        target.happyMarry();
        after();
    }
    private void before(){
        System.out.println("結(jié)婚之前:布置婚禮現(xiàn)場(chǎng)");
    }
    private void after(){
        System.out.println("結(jié)婚之后:收尾工作");
    }
}

對(duì)于Java中的Thread底層就使用的靜態(tài)代理模式,源碼分析

//Thread類實(shí)現(xiàn)了Runnable接口
public class Thread implements Runnable{
  //引入了真實(shí)對(duì)象
  private Runnable target;
  //代理對(duì)象中的構(gòu)造器
  public Thread(Runnable target, String name) {
         init(null, target, name, 0);
  }
}

當(dāng)我們開啟一個(gè)線程,其實(shí)就是定義了一個(gè)真實(shí)角色實(shí)現(xiàn)了Runnable接口,重寫了run方法。

public void TestRunnable{
    public static void main(String[] args){
      MyThread myThread = new MyThread();
      new Thread(myThread,"張三").start();
      //Thread就是代理角色,myThread就是真實(shí)角色,start()就是實(shí)現(xiàn)方法
    }
}
class MyThread implements Runnable{
   @Override
   public void run() {
     System.out.println("我是子線程,同時(shí)是真實(shí)角色");
   }
}

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

1、動(dòng)態(tài)代理的引入

上面使用到了靜態(tài)代理,代理類是自己手工實(shí)現(xiàn)的,自己創(chuàng)建了java類表示代理類,同時(shí)要代理的目標(biāo)類也是確定的,如果當(dāng)目標(biāo)類增多時(shí),代理類也需要成倍的增加,代理類的數(shù)量過(guò)多,當(dāng)接口中的方法改變或者修改時(shí),會(huì)影響實(shí)現(xiàn)類,廠家類,代理都需要修改,于是乎就有了jdk動(dòng)態(tài)代理。

2、動(dòng)態(tài)代理的好處

  • 代理類數(shù)量減少
  • 修改接口中的方法不影響代理類
  • 實(shí)現(xiàn)解耦合,讓業(yè)務(wù)功能和日志、事務(wù)和非事務(wù)功能分離

3、動(dòng)態(tài)代理的實(shí)現(xiàn)步驟

  • 創(chuàng)建接口,定義目標(biāo)類要完成功能。
  • 創(chuàng)建目標(biāo)類實(shí)現(xiàn)接口。
  • 創(chuàng)建InvocationHandler接口實(shí)現(xiàn)類,在invoke()方法中完成代理類的功能。
  • 使用Proxy類的靜態(tài)方法,創(chuàng)建代理對(duì)象,并且將返回值轉(zhuǎn)換為接口類型。

以下是代碼案例:

/**
 * @ClassName DynamicProxy
 * @Description TODO 動(dòng)態(tài)代理
 * @Author ZhangHao
 * @Date 2022/12/11 15:11
 * @Version: 1.0
 */
public class DynamicProxy {
    public static void main(String[] args) {
        //創(chuàng)建目標(biāo)對(duì)象
        Marry target = new You();
        //創(chuàng)建InvocationHandler對(duì)象
        MyInvocationHandler handler = new MyInvocationHandler(target);
        //創(chuàng)建代理對(duì)象
        Marry proxy = (Marry)handler.getProxy();
        //通過(guò)代理執(zhí)行方法,會(huì)調(diào)用handle中的invoke()方法
        proxy.happyMarry();
    }
}
//創(chuàng)建結(jié)婚接口
interface Marry{
    void happyMarry();
}
//目標(biāo)類實(shí)現(xiàn)結(jié)婚接口
class You implements Marry{
    @Override
    public void happyMarry() {
        System.out.println("張三結(jié)婚了!");
    }
}
//創(chuàng)建工具類,即方法增強(qiáng)的功能
class ServiceTools{
    public static void before(){
        System.out.println("結(jié)婚之前:布置婚禮現(xiàn)場(chǎng)");
    }
    public static void after(){
        System.out.println("結(jié)婚之后:清理結(jié)婚現(xiàn)場(chǎng)");
    }
}
//創(chuàng)建InvocationHandler的實(shí)現(xiàn)類
class MyInvocationHandler implements InvocationHandler{
    //目標(biāo)對(duì)象
    private Object target;
    public MyInvocationHandler(Object target){
        this.target = target;
    }
    //通過(guò)代理對(duì)象執(zhí)行方法時(shí),會(huì)調(diào)用invoke()方法
    /**
     * @Param [proxy:jdk創(chuàng)建的代理類的實(shí)例]
     * @Param [method:目標(biāo)類中被代理方法]
     * @Param [args:目標(biāo)類中方法的參數(shù)]
     * @return java.lang.Object
    **/
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //增強(qiáng)功能
        ServiceTools.before();
        //執(zhí)行目標(biāo)類中的方法
        Object obj = null;
        obj = method.invoke(target,args);
        ServiceTools.after();
        return obj;
    }
    //通過(guò)Proxy類創(chuàng)建代理對(duì)象(自己手寫的嗷)
    /**
     * @Param [ClassLoader loader:類加載器,負(fù)責(zé)向內(nèi)存中加載對(duì)象的,使用反射獲取對(duì)象的ClassLoader]
     * @Param [Class<?>[] interfaces: 接口, 目標(biāo)對(duì)象實(shí)現(xiàn)的接口,也是反射獲取的。]
     * @Param [InvocationHandler h: 我們自己寫的,代理類要完成的功能。]
     * @return java.lang.Object
    **/
    public Object getProxy(){
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);
    }
}

三、總結(jié)

代理分為靜態(tài)代理和動(dòng)態(tài)代理

靜態(tài)代理需要手動(dòng)書寫代理類,動(dòng)態(tài)代理通過(guò)Proxy.newInstance()方法生成

不管是靜態(tài)代理還是動(dòng)態(tài)代理,代理與被代理者都要實(shí)現(xiàn)兩樣接口,本質(zhì)面向接口編程

代理模式本質(zhì)上的目的是為了在不改變?cè)写a的基礎(chǔ)上增強(qiáng)現(xiàn)有代碼的功能

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

相關(guān)文章

  • 關(guān)于Java創(chuàng)建線程的2種方式以及對(duì)比

    關(guān)于Java創(chuàng)建線程的2種方式以及對(duì)比

    這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建線程的2種方式以及對(duì)比的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • JavaWeb利用struts實(shí)現(xiàn)文件下載時(shí)改變文件名稱

    JavaWeb利用struts實(shí)現(xiàn)文件下載時(shí)改變文件名稱

    這篇文章主要為大家詳細(xì)介紹了JavaWeb利用struts實(shí)現(xiàn)文件下載時(shí)改變文件名稱的相關(guān)資料,需要的朋友可以參考下
    2016-06-06
  • Java8?Stream?collect(Collectors.toMap())的使用

    Java8?Stream?collect(Collectors.toMap())的使用

    這篇文章主要介紹了Java8?Stream?collect(Collectors.toMap())的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 深度解析Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景

    深度解析Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景

    這篇文章主要介紹了Java中volatile的內(nèi)存語(yǔ)義實(shí)現(xiàn)以及運(yùn)用場(chǎng)景,通過(guò)JVM的機(jī)制來(lái)分析volatile關(guān)鍵字在線程編程中的作用,需要的朋友可以參考下
    2015-12-12
  • Java中面向?qū)ο蟮闹R(shí)點(diǎn)總結(jié)

    Java中面向?qū)ο蟮闹R(shí)點(diǎn)總結(jié)

    Java是一門面向?qū)ο蟮恼Z(yǔ)言。對(duì)象是Java程序中的基本實(shí)體。除了對(duì)象之外Java程序同樣處理基本數(shù)據(jù)。下面這篇文章主要給大家總結(jié)了關(guān)于Java中面向?qū)ο蟮闹R(shí)點(diǎn),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • java 如何復(fù)制非空對(duì)象屬性值

    java 如何復(fù)制非空對(duì)象屬性值

    這篇文章主要介紹了java 如何復(fù)制非空對(duì)象屬性值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java中最易犯錯(cuò)的特殊字符示例詳解

    java中最易犯錯(cuò)的特殊字符示例詳解

    這篇文章主要給大家介紹了關(guān)于java中最易犯錯(cuò)的特殊字符的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • JAVA Log 日志級(jí)別和使用配置示例

    JAVA Log 日志級(jí)別和使用配置示例

    本文介紹了Java中主流的日志框架,包括Logback和Log4j2,并詳細(xì)解釋了日志級(jí)別及其使用場(chǎng)景,同時(shí),還提供了配置示例和使用技巧,如正確的日志記錄方式、異常日志記錄、性能優(yōu)化以及環(huán)境特定的日志配置,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-11-11
  • SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn)

    SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn)

    本文主要介紹了SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Spark SQL關(guān)于性能調(diào)優(yōu)選項(xiàng)詳解

    Spark SQL關(guān)于性能調(diào)優(yōu)選項(xiàng)詳解

    這篇文章將為大家詳細(xì)講解有關(guān)Spark SQL性能調(diào)優(yōu)選項(xiàng),小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲
    2023-02-02

最新評(píng)論

嘉荫县| 浦江县| 凤台县| 闽侯县| 杭锦旗| 柘荣县| 洛扎县| 常熟市| 沙洋县| 稻城县| 襄樊市| 洪湖市| 嘉兴市| 明水县| 板桥市| 永德县| 拉萨市| 瓮安县| 安徽省| 湖口县| 凤台县| 高雄县| 建始县| 遂昌县| 双流县| 澳门| 文安县| 黑水县| 锡林郭勒盟| 时尚| 横峰县| 洛川县| 嵊泗县| 英山县| 卢龙县| 依安县| 仁布县| 关岭| 朝阳县| 霞浦县| 临泉县|