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

Java動態(tài)代理實現(xiàn)方法小結(jié)

 更新時間:2019年02月22日 10:23:54   作者:changuncle  
這篇文章主要介紹了Java動態(tài)代理實現(xiàn)方法,結(jié)合實例形式總結(jié)分析了java基于JDK、CGLIB及CGLIB實現(xiàn)動態(tài)代理的相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了Java動態(tài)代理實現(xiàn)方法。分享給大家供大家參考,具體如下:

靜態(tài)代理了解的差不多了,但是對于動態(tài)代理理解的還不是很通透,這里先把一些常用的動態(tài)代理實現(xiàn)方法記錄下來,日后時??纯礌幦≡缛杖跁炌?。

1、JDK實現(xiàn)動態(tài)代理

主要使用了Proxy.newProxyInstance()方法,該方法的官方解釋為:返回一個指定接口的代理類實例,該接口可以將方法調(diào)用指派到指定的調(diào)用處理程序。

public interface ISomeService {
  String doFirst();
  void doSecond();
  String doThird();
}
//目標類:代理類要增強的類
public class SomeServiceImpl implements ISomeService {
  @Override
  public String doFirst() {
    return "AAAbbb";
  }
  @Override
  public void doSecond() {
    System.out.println("SomeServiceImpl:執(zhí)行doSecond()");
  }
  @Override
  public String doThird() {
    return "aaa";
  }
}
public class Mytest {
  public static void main(String[] args) {
    ISomeService target = new SomeServiceImpl();
    ISomeService someService = (ISomeService) Proxy.newProxyInstance(
        target.getClass().getClassLoader(),
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          // proxy:代理對象
          // method:目標方法
          // args:目標方法的參數(shù)列表
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object result = method.invoke(target, args);
            if(result!=null) {
              result=((String)result).toUpperCase();
            }
            return result;
          }
        });
    System.out.println(someService.doFirst());
    someService.doSecond();
    System.out.println(someService.doThird());
  }
}

2、CGLIB實現(xiàn)動態(tài)代理(沒接口)

使用JDK的Proxy實現(xiàn)動態(tài)代理,要求目標類與代理類實現(xiàn)相同的接口,若目標類不存在接口,則無法使用該方式實現(xiàn)。

對于沒有接口的類,要為其創(chuàng)建動態(tài)代理,就要使用CGLIB來實現(xiàn)。CGLIB動態(tài)代理的生成原理是生成目標類的子類,而子類是增強過的,這個子類對象就是代理對象。使用CGLIB生成代理類,要求目標類必須能被繼承,因此不能是final類。

//目標類:代理類要增強的類
public class SomeService {
  public String doFirst() {
    System.out.println("SomeServiceImpl:執(zhí)行doFirst()");
    return "AAAbbb";
  }
  public void doSecond() {
    System.out.println("SomeServiceImpl:執(zhí)行doSecond()");
  }
}
//注意:使用Cglib動態(tài)代理,要求目標類不能是final的
//Cglib動態(tài)代理的增強原理是:子類增強父類,所以目標類必須能被繼承
public class CglibFactory implements MethodInterceptor {
  private SomeService target;
  public CglibFactory() { }
  public CglibFactory(SomeService target) {
    this.target = target;
  }
  public SomeService myCglibCreator() {
    Enhancer enhancer = new Enhancer();
    //指定父類,即目標類。因為Cglib動態(tài)代理增強的原理是:子類增強父類
    enhancer.setSuperclass(SomeService.class);
    //設(shè)置回調(diào)接口對象
    enhancer.setCallback(this);
    //create()方法用于創(chuàng)建Cglib動態(tài)代理對象
    return (SomeService)enhancer.create();
  }
  //回調(diào)函數(shù)的執(zhí)行條件:代理對象執(zhí)行目標方法時會觸發(fā)該方法
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    Object invoke = method.invoke(target, args);
    if(invoke!=null) {
      invoke=((String)invoke).toUpperCase();
    }
    return invoke;
  }
}
public class Mytest {
  public static void main(String[] args) {
    SomeService target = new SomeService();
    SomeService proxy = new CglibFactory(target).myCglibCreator();
    proxy.doFirst();
  }
}

3、CGLIB實現(xiàn)動態(tài)代理(有接口)

在有接口的情況下利用CGLIB實現(xiàn)動態(tài)代理跟沒有接口的情況下利用CGLIB實現(xiàn)動態(tài)代理,其實差不多。

public interface ISomeService {
  String doFirst();
  void doSecond();
  String doThird();
}
//目標類:代理類要增強的類
public class SomeService implements ISomeService {
  public String doFirst() {
    return "AAAbbb";
  }
  public void doSecond() {
    System.out.println("SomeServiceImpl:執(zhí)行doSecond()");
  }
  @Override
  public String doThird() {
    return "third";
  }
}
//注意:使用Cglib動態(tài)代理,要求目標類不能是final的
//Cglib動態(tài)代理的增強原理是:子類增強父類,所以目標類必須能被繼承
public class CglibFactory implements MethodInterceptor {
  private ISomeService target;
  public CglibFactory() { }
  public CglibFactory(ISomeService target) {
    this.target = target;
  }
  public ISomeService myCglibCreator() {
    Enhancer enhancer = new Enhancer();
    //指定父類,即目標類。因為Cglib動態(tài)代理增強的原理是:子類增強父類
    enhancer.setSuperclass(ISomeService.class);
    //設(shè)置回調(diào)接口對象
    enhancer.setCallback(this);
    //create()方法用于創(chuàng)建Cglib動態(tài)代理對象
    return (ISomeService)enhancer.create();
  }
  //回調(diào)函數(shù)的執(zhí)行條件:代理對象執(zhí)行目標方法時會觸發(fā)該方法
  @Override
  public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    Object invoke = method.invoke(target, args);
    if(invoke!=null) {
      invoke=((String)invoke).toUpperCase();
    }
    return invoke;
  }
}
public class Mytest {
  public static void main(String[] args) {
    ISomeService target = new SomeService();
    ISomeService proxy = new CglibFactory(target).myCglibCreator();
    System.out.println(proxy.doFirst());
    proxy.doSecond();
    System.out.println(proxy.doThird());
  }
}

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計入門與進階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計有所幫助。

相關(guān)文章

  • Java多線程之搞定最后一公里詳解

    Java多線程之搞定最后一公里詳解

    Java 給多線程編程提供了內(nèi)置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以并發(fā)多個線程,每條線程并行執(zhí)行不同的任務(wù),多線程是多任務(wù)的一種特別的形式,但多線程使用了更小的資源開銷
    2021-10-10
  • java實現(xiàn)簡單驗證碼生成

    java實現(xiàn)簡單驗證碼生成

    這篇文章主要介紹了java實現(xiàn)簡單驗證碼生成,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 在Java中將List轉(zhuǎn)換為String輸出過程解析

    在Java中將List轉(zhuǎn)換為String輸出過程解析

    這篇文章主要介紹了在Java中將List轉(zhuǎn)換為String輸出過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot實戰(zhàn)教程之新手入門篇

    SpringBoot實戰(zhàn)教程之新手入門篇

    Spring Boot使我們更容易去創(chuàng)建基于Spring的獨立和產(chǎn)品級的可以"即時運行"的應(yīng)用和服務(wù),下面這篇文章主要給大家介紹了關(guān)于SpringBoot實戰(zhàn)教程之入門篇的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 深入解析@InitBinder注解的功能與應(yīng)用

    深入解析@InitBinder注解的功能與應(yīng)用

    這篇文章主要介紹了深入解析@InitBinder注解的功能與應(yīng)用,從字面意思可以看出這個的作用是給Binder做初始化的,被此注解的方法可以對WebDataBinder初始化,webDataBinder是用于表單到方法的數(shù)據(jù)綁定的,需要的朋友可以參考下
    2023-10-10
  • Springboot通過谷歌Kaptcha?組件生成圖形驗證碼功能

    Springboot通過谷歌Kaptcha?組件生成圖形驗證碼功能

    Kaptcha是谷歌開源的一款簡單實用的圖形驗證碼組件。我個人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項目中,這篇文章主要介紹了Springboot通過谷歌Kaptcha組件生成圖形驗證碼的方法,需要的朋友可以參考下
    2023-05-05
  • Java面向?qū)ο蠡A(chǔ)詳解

    Java面向?qū)ο蠡A(chǔ)詳解

    這篇文章主要介紹了JJava面向?qū)ο蟮幕A(chǔ),文中有非常詳細的代碼示例,對正在學(xué)習java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-10-10
  • Java中@Accessors注解的具體使用

    Java中@Accessors注解的具體使用

    @Accessors是Lombok提供的注解之一,用于自動生成getter和setter方法,本文主要介紹了@Accessors注解的常用屬性,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Java中的HttpServletRequest接口詳細解讀

    Java中的HttpServletRequest接口詳細解讀

    這篇文章主要介紹了Java中的HttpServletRequest接口詳細解讀,是一個接口,全限定名稱為Jakarta.Serclet.http.HttpServletRequest
    HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下
    2023-11-11
  • 全面分析Java文件上傳

    全面分析Java文件上傳

    本片文章給大家詳細分析了Java文件上傳的相關(guān)知識點,以及相關(guān)代碼做了詳細分析,有興趣的朋友學(xué)習下。
    2018-02-02

最新評論

石泉县| 中阳县| 宁夏| 正安县| 原平市| 绥中县| 双桥区| 山丹县| 丹棱县| 江北区| 雷州市| 阿拉善右旗| 淮阳县| 浦江县| 达拉特旗| 邢台市| 赫章县| 竹山县| 铜山县| 五峰| 梓潼县| 云霄县| 民乐县| 正宁县| 芷江| 德州市| 和硕县| 贵定县| 连云港市| 甘孜| 正宁县| 五台县| 伊川县| 喀什市| 抚松县| 蓝山县| 凉山| 瑞金市| 丹巴县| 科技| 长丰县|