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

深入理解java動態(tài)代理的兩種實現(xiàn)方式(JDK/Cglib)

 更新時間:2017年04月05日 09:09:00   作者:PerKins.Zhu  
本篇文章主要介紹了java動態(tài)代理的兩種實現(xiàn)方式,詳細的介紹了JDK和Cglib的實現(xiàn)方法,具有一定的參考價值,有興趣的可以了解一下

什么是代理模式?

代理模式:在調(diào)用處不直接調(diào)用目標類進行操作,而是調(diào)用代理類,然后通過代理類來調(diào)用目標類進行操作。在代理類調(diào)用目標類的前后可以添加一些預(yù)處理和后處理操作來完成一些不屬于目標類的功能。

為什么要使用代理模式?

通過代理模式可以實現(xiàn)對目標類調(diào)用的控制、在目標類調(diào)用前/后進行一些不屬于目標類的操作,如:數(shù)據(jù)驗證、預(yù)處理、后處理、異常處理等

什么是靜態(tài)代理什么是動態(tài)代理?

  1. 靜態(tài)代理:代理類只能實現(xiàn)對”特定接口的實現(xiàn)類“進行代理
  2. 動態(tài)代理:代理類可以實現(xiàn)對多種類的代理

jdk代理和cglib代理區(qū)別在哪里?

  1. jdk動態(tài)代理:代理所有“實現(xiàn)的有接口”的目標類
  2. cglib動態(tài)代理:代理任意一個目標類,但對final類和方法無法代理

不同點:jdk動態(tài)代理的目標類必須實現(xiàn)的有接口,因為在調(diào)用Proxy.newProxyInstance()的時候需要傳入目標類的接口類。而cglib不做此限制。    

下面看代碼分析:

定義一個Person接口

package com.zpj.designMode.proxy;

//定義一個Person接口
public interface Person {
  public void doWork();
}

添加一個實現(xiàn)類:MrLi

package com.zpj.designMode.proxy;

//添加一個實現(xiàn)類
public class MrLi implements Person {

  @Override
  public void doWork() {
    System.out.println("-----doWork");
  }

}

靜態(tài)代理:

添加一個靜態(tài)代理類Proxy

package com.zpj.designMode.proxy;

//靜態(tài)代理,代理必須和目標類實現(xiàn)共同的接口
public class Proxy implements Person {
  private Person person;// 被代理人

  //這里的目標類型決定了該代理類只能代理實現(xiàn)了Person接口的實例,而不能接收其他類型參數(shù),這也就是靜態(tài)代理的局限性
  public Proxy(Person person) {
    this.person = person;
  }

  @Override
  public void doWork() {
    System.out.println("doSomething-----start");
    person.doWork();
    System.out.println("doSomething-----end");
  }

}

靜態(tài)代理測試程序:

package com.zpj.designMode.proxy;

public class Run {
  public static void main(String[] args) {
    MrLi li = new MrLi();
    Proxy proxy = new Proxy(li);
    //調(diào)用處直接調(diào)用代理進行目標方法的操作。
    proxy.doWork();
  }
}

JDK動態(tài)代理:

添加一個代理JDKProxy,該代理實現(xiàn)InvocationHandler接口且覆寫invoke方法。

package com.zpj.designMode.proxy.jdk;

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

/***
 @author Perkins Zhu
 @date 2017年3月13日 上午8:41:10
 */
public class JDKProxy implements InvocationHandler {

  private Object person;// 被代理人
   
  
  //這里的目標類型為Object,則可以接受任意一種參數(shù)作為被代理類,實現(xiàn)了動態(tài)代理。但是要注意下面的newProxyInstance()中的參數(shù)
  public Object getInstance(Object person) {
    this.person = person;
    //與cglib的區(qū)別在于這里構(gòu)建代理對象的時候需要傳入被代理對象的接口對象,第二個參數(shù)。而cglib不需要被代理對象實現(xiàn)任何接口即可    
    return Proxy.newProxyInstance(person.getClass().getClassLoader(), person.getClass().getInterfaces(), this);
  }

 

  @Override
  public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("doSomething---------start");
    method.invoke(person, args);
    System.out.println("doSomething---------end");
    return null;
  }

}

JDK動態(tài)代理測試程序

package com.zpj.designMode.proxy.jdk;

import com.zpj.designMode.proxy.MrLi;
import com.zpj.designMode.proxy.Person;

/***
 * @author Perkins Zhu
 * @date 2017年3月13日 上午8:51:31
 */
public class Run {

  public static void main(String[] args) {
    Person person = (Person) new JDKProxy().getInstance(new MrLi());
    //注意這里的person不是目標類person,而是代理類person:debug的時候顯示null,有'$'標識符
    person.doWork();
  }
}

Cglib動態(tài)代理:

添加一個CglibProxy代理,同時實現(xiàn)MethodInterceptor接口。

package com.zpj.designMode.proxy.cglib;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/***
 * @author Perkins Zhu
 * @date 2017年3月13日 上午9:02:54
 */
public class CglibProxy implements MethodInterceptor {
  private Object targetObject;

  // 這里的目標類型為Object,則可以接受任意一種參數(shù)作為被代理類,實現(xiàn)了動態(tài)代理
  public Object getInstance(Object target) {
    this.targetObject = target;
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(target.getClass());
    enhancer.setCallback(this);
    //注意該處代理的創(chuàng)建過程
    Object proxyObj = enhancer.create();
    return proxyObj;// 返回代理對象
  }

  @Override
  public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    Object obj = null;
    System.out.println("doSomething---------start");
    obj = method.invoke(targetObject, args);
    System.out.println("doSomething---------end");
    return obj;
  }

}

Cglib動態(tài)代理測試程序

package com.zpj.designMode.proxy.cglib;

import com.zpj.designMode.proxy.MrLi;
import com.zpj.designMode.proxy.Person;

/***
 @author Perkins Zhu
 @date 2017年3月13日 上午9:07:38
 */
public class Run {

  public static void main(String[] args) {
    Person person = (Person)new CglibProxy().getInstance(new MrLi());
    person.doWork();
  }
}

仔細對比Proxy、CglibProxy和JDKProxy區(qū)分靜態(tài)代理、JDK動態(tài)代理和Cglib動態(tài)代理的異同點!

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot集成ftp實現(xiàn)文件上傳

    springboot集成ftp實現(xiàn)文件上傳

    這篇文章主要為大家詳細介紹了springboot集成ftp實現(xiàn)文件上傳,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • java語言實現(xiàn)權(quán)重隨機算法完整實例

    java語言實現(xiàn)權(quán)重隨機算法完整實例

    這篇文章主要介紹了java語言實現(xiàn)權(quán)重隨機算法完整實例,具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • idea同步y(tǒng)api插件的詳細步驟

    idea同步y(tǒng)api插件的詳細步驟

    yapi是一個很好的接口文檔維護工具,其swagger功能,可將接口信息同步到y(tǒng)api平臺上,這篇文章主要介紹了idea同步y(tǒng)api插件,需要的朋友可以參考下
    2024-04-04
  • SpringBoot+Quartz+數(shù)據(jù)庫存儲的完美集合

    SpringBoot+Quartz+數(shù)據(jù)庫存儲的完美集合

    這篇文章主要介紹了SpringBoot+Quartz+數(shù)據(jù)庫存儲的示例代碼,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • TK-MyBatis 分頁查詢的具體使用

    TK-MyBatis 分頁查詢的具體使用

    分頁查詢在很多地方都可以使用到,本文就詳細的介紹了一下TK-MyBatis 分頁查詢的具體使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Spring中@DependsOn注解的作用及實現(xiàn)原理解析

    Spring中@DependsOn注解的作用及實現(xiàn)原理解析

    這篇文章主要介紹了Spring中@DependsOn注解的作用及實現(xiàn)原理解析,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Java?RabbitMQ消息隊列詳解常見問題

    Java?RabbitMQ消息隊列詳解常見問題

    消息隊列是最古老的中間件之一,從系統(tǒng)之間有通信需求開始,就自然產(chǎn)生了消息隊列。本文告訴什么是消息隊列,為什么需要消息隊列,常見的消息隊列有哪些,RabbitMQ的部署和使用
    2022-07-07
  • servlet 解決亂碼問題

    servlet 解決亂碼問題

    這篇文章主要介紹了servlet 解決亂碼問題 ,需要的朋友可以參考下
    2015-04-04
  • springboot過濾器執(zhí)行兩次的解決及跨域過濾器問題

    springboot過濾器執(zhí)行兩次的解決及跨域過濾器問題

    這篇文章主要介紹了springboot過濾器執(zhí)行兩次的解決及跨域過濾器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解eclipse項目中的.classpath文件原理

    詳解eclipse項目中的.classpath文件原理

    這篇文章介紹了eclipse項目中的.classpath文件的原理,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-12-12

最新評論

永顺县| 荣成市| 和静县| 盐亭县| 九寨沟县| 肥东县| 毕节市| 丹阳市| 长岛县| 大厂| 怀仁县| 伊金霍洛旗| 陇川县| 丰原市| 庐江县| 平湖市| 万源市| 沂水县| 东光县| 双牌县| 汝城县| 蓝山县| 论坛| 米易县| 甘洛县| 静安区| 蓬安县| 田东县| 阳朔县| 清新县| 蒙城县| 蕲春县| 旬阳县| 疏勒县| 鸡西市| 长垣县| 天水市| 武城县| 宿迁市| 盖州市| 宁晋县|