中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java代理模式實例代碼分析

發布時間:2022-04-01 09:11:10 來源:億速云 閱讀:134 作者:iii 欄目:開發技術

今天小編給大家分享一下Java代理模式實例代碼分析的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

1、動態代理模式

動態代理的特點:

  • 當代理對象的時候,不需要實現接口

  • 代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型)

動態代理的別稱:JDK代理、接口代理

2、JDK動態代理

類圖:

Java代理模式實例代碼分析

Java動態代理類位于java.lang.reflect包下

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

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

2、Proxy:該類即為動態代理類

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

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

動態代的實現步驟:

  • 創建一個實現接口InvocationHandler的類,它必須實現invoke方法

  • 創建被代理的類以及接口

  • 調用Proxy的靜態方法,創建一個代理類:newProxyInstance(ClassLoader loader,Class[]

  • 通過代理調用方法

3、JDK動態代理代碼演示

比如現在有一個汽車駕駛的方法:

public interface Moveable {
    void move();
}

現在有一輛汽車:

//實現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:方法的參數
     * @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的參數
         * 分別是:類加載器、實現的接口、實現的處理器
         */
        Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(),h);
        m.move();
    }
}

這樣的輸出結果是:

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

注意:

JDK代理只能代理實現了接口的類,沒有實現接口的不能代理

Java代理模式實例代碼分析

以上就是JDK動態代理,當然還有cglib動態代理:

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

以上就是“Java代理模式實例代碼分析”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

葵青区| 太湖县| 长阳| 喀什市| 宁陕县| 辉县市| 扎囊县| 湘西| 大厂| 同仁县| 宣威市| 平远县| 马鞍山市| 桦甸市| 夹江县| 修武县| 永靖县| 华容县| 盐城市| 遵义县| 望奎县| 凌云县| 安塞县| 光泽县| 海口市| 邻水| 榆中县| 遂川县| 慈利县| 清涧县| 中卫市| 玉屏| 望谟县| 剑河县| 安阳县| 江门市| 沙洋县| 民权县| 滁州市| 达日县| 滨州市|