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

Java 深入淺出講解代理模式

 更新時間:2022年03月31日 17:33:20   作者:熱愛飛行的小應學長  
代理模式是Java常見的設計模式之一。所謂代理模式是指客戶端并不直接調用實際的對象,而是通過調用代理,來間接的調用實際的對象

1、動態(tài)代理模式

動態(tài)代理的特點:

  • 當代理對象的時候,不需要實現(xiàn)接口
  • 代理對象的生成,是利用JDK的API,動態(tài)的在內存中構建代理對象(需要我們指定創(chuàng)建代理對象/目標對象實現(xiàn)的接口的類型)

動態(tài)代理的別稱:JDK代理、接口代理

2、JDK動態(tài)代理

類圖:

在這里插入圖片描述

Java動態(tài)代理類位于java.lang.reflect包下

一般主要涉及到以下兩個類:

1、Interface InvocationHandler : 該接口中僅定義了一個方法public object invoke(Object obj,Method method, Object[] args) 在實際使用時,第一個參數(shù)obj一般是指代理類,method是被代理的方法,args為該方法的參數(shù)數(shù)組。這個抽象方法在代理類中動態(tài)實現(xiàn)。

2、Proxy:該類即為動態(tài)代理類

static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h):

返回代理類的一個實例,返回后的代理類可以當作被代理類使用(可使用被代理類的在接口中聲明過的方法)

動態(tài)代的實現(xiàn)步驟:

  • 創(chuàng)建一個實現(xiàn)接口InvocationHandler的類,它必須實現(xiàn)invoke方法
  • 創(chuàng)建被代理的類以及接口
  • 調用Proxy的靜態(tài)方法,創(chuàng)建一個代理類:newProxyInstance(ClassLoader loader,Class[]
  • 通過代理調用方法

3、JDK動態(tài)代理代碼演示

比如現(xiàn)在有一個汽車駕駛的方法:

public interface Moveable {
    void move();
}

現(xiàn)在有一輛汽車:

//實現(xiàn)Moveable 接口,并隨機暫停一段時間

import java.util.Random;
public class Car implements Moveable{
    @Override
    public void move() {
        try{
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("汽車行駛中");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

時間代理類:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler{

    public TimeHandler(Object target){
        super();
        this.target = target;
    }
    private Object target;


    /**
     *
     * @param proxy :被代理的對象
     * @param method:被代理對象的方法
     * @param args:方法的參數(shù)
     * @return
     * @throws Throwable
     * 返回值:Object 方法的返回值
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        long startTime = System.currentTimeMillis();
        System.out.println("汽車開始行使");

        method.invoke(target);

        long endTime = System.currentTimeMillis();
        System.out.println("汽車行駛結束,行駛的時間為:"+(endTime-startTime)+"毫秒");
        return null;
    }
}

測試類:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {
    public static void main(String[] args) {

        Car car = new Car();
        InvocationHandler h = new TimeHandler(car);
        Class<?> cls = car.getClass();

        /**
         * newProxyInstanced的參數(shù)
         * 分別是:類加載器、實現(xiàn)的接口、實現(xiàn)的處理器
         */
        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(),h);
        m.move();
    }
}

這樣的輸出結果是:

汽車開始行使
汽車行駛中
汽車行駛結束,行駛的時間為:137毫秒
//后面的時間是隨機產(chǎn)生的,每次都不一樣

注意:

JDK代理只能代理實現(xiàn)了接口的類,沒有實現(xiàn)接口的不能代理

在這里插入圖片描述

以上就是JDK動態(tài)代理,當然還有cglib動態(tài)代理:

cglib是針對類來實現(xiàn)代理的,cglib的原理是對指定的目標類生成一個子類,并覆蓋其中方法實現(xiàn)增強,但因為采用的是繼承,所以不能對final修飾的類進行代理,因為小應學長自己對這一塊也沒有完全掌握,這里就不多講解,大家可以參考其他博主的技術文章。

三月份完美收官!最后小應學長十分感謝大家的支持的陪伴,你們在支持是我最大的動力,繼續(xù)寫出大家喜歡的文章!

到此這篇關于Java 深入淺出講解代理模式的文章就介紹到這了,更多相關Java 代理模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java實現(xiàn)抽獎概率類

    java實現(xiàn)抽獎概率類

    這篇文章主要為大家詳細介紹了java實現(xiàn)抽獎概率類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Java中的異步非阻塞AIO模型詳解

    Java中的異步非阻塞AIO模型詳解

    這篇文章主要介紹了Java中的異步非阻塞AIO模型詳解,AIO需要操作系統(tǒng)的支持,在linux內核2.6版本中加入了對真正異步IO的支持,java從jdk1.7開始支持AIO,本文提供了部分實現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • java selenium教程之selenium詳細介紹

    java selenium教程之selenium詳細介紹

    本文主要介紹Java selenium,這里整理了selenium的一些基本資料,此軟件主要用于Web UI自動測試框架,有興趣的同學可以看一下
    2016-08-08
  • Java中各種集合判空方法總結

    Java中各種集合判空方法總結

    最近接觸集合比較多,經(jīng)常對于集合是否為空做判斷,下面這篇文章主要給大家介紹了關于Java中各種集合判空方法總結的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Java集合Map的clear與new Map區(qū)別詳解

    Java集合Map的clear與new Map區(qū)別詳解

    這篇文章主要介紹了Java集合Map的clear與new Map區(qū)別詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java通過cellstyle屬性設置Excel單元格常用樣式的全面總結講解

    Java通過cellstyle屬性設置Excel單元格常用樣式的全面總結講解

    在處理Excel文件時,經(jīng)常需要對單元格進行樣式設置,以滿足特定的需求和美化要求,這篇文章主要給大家介紹了關于Java通過cellstyle屬性設置Excel單元格常用樣式的相關資料,需要的朋友可以參考下
    2024-01-01
  • 全網(wǎng)最全Mybatis-Plus詳解

    全網(wǎng)最全Mybatis-Plus詳解

    Mybatis-Plus是一個Mybatis(opens?new?window)的增強工具,在Mybatis的基礎上只做增強不做改變,為簡化開發(fā),這篇文章主要介紹了全網(wǎng)最全Mybatis-Plus詳解,需要的朋友可以參考下
    2024-05-05
  • @MapperScan注解與@Mapper注解的使用

    @MapperScan注解與@Mapper注解的使用

    這篇文章主要介紹了@MapperScan注解與@Mapper注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring集成事務代碼實例

    Spring集成事務代碼實例

    這篇文章主要介紹了Spring集成事務代碼實例,pring事務的本質其實就是數(shù)據(jù)庫對事務的支持,使用JDBC的事務管理機制,就是利用java.sql.Connection對象完成對事務的提交,需要的朋友可以參考下
    2023-10-10
  • MyBatis根據(jù)條件批量修改字段的方式

    MyBatis根據(jù)條件批量修改字段的方式

    這篇文章主要介紹了MyBatis根據(jù)條件批量修改字段的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論

教育| 合山市| 西乌珠穆沁旗| 武强县| 三台县| 盐津县| 苏尼特右旗| 土默特右旗| 昆山市| 建湖县| 尚志市| 滁州市| 吉木乃县| 永年县| 屏山县| 禹州市| 柳州市| 龙州县| 长岛县| 凤山市| 鄢陵县| 木里| 荔波县| 无棣县| 栖霞市| 桐梓县| 新巴尔虎左旗| 延边| 囊谦县| 石阡县| 大埔区| 兴和县| 通城县| 集安市| 淮滨县| 天津市| 宁晋县| 宜春市| 拉孜县| 敦煌市| 凌源市|