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

Java靜態(tài)代理和動(dòng)態(tài)代理總結(jié)

 更新時(shí)間:2017年02月19日 16:36:19   作者:LZHL  
這篇文章主要介紹了Java靜態(tài)代理和動(dòng)態(tài)代理總結(jié),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

靜態(tài)代理

第一種實(shí)現(xiàn)(基于接口):

1》接口

public interface Hello {
 void say(String msg);
}

2》目標(biāo)類,至少實(shí)現(xiàn)一個(gè)接口

public class HelloImpl implements Hello {
 public void say(String msg) {
  System.out.println("Hi,"+msg);
 }
}

3》代理類(與目標(biāo)類實(shí)現(xiàn)相同接口,從而保證功能一致)

public class HelloProxy implements Hello{
 private Hello hello;
 public HelloProxy(Hello hello){
  this.hello = hello;
 }
 public void say(String msg){
  before();
  hello.say(msg);
  after();
 }
 private void before(){
  System.out.println("Before");
 }
 private void after(){
  System.out.println("After");
 }
}

3》測(cè)試

/**
 * @Author LZHL
 * @Create 2017-02-19 10:26
 * @Description
 */
public class Main {
 public static void main(String[] args) throws Exception {
  HelloImpl target = new HelloImpl();
  HelloProxy proxy = new HelloProxy(target);
  proxy.say("LZHL");
 }
}

第二種實(shí)現(xiàn)(基于目標(biāo)類):

1>目標(biāo)類

public class HelloTarget {
 public void sayHello(String name){
  System.out.println("Hi,"+name);
 }
}

2>代理類(通過繼承目標(biāo)類,保證功能一致)

public class HelloProxy extends HelloTarget{
  private HelloTarget target;
  public HelloProxy(HelloTarget target){
    this.target = target;
  } 
  @Override
 public void sayHello(String name) {
  this.before();
  target.sayHello(name);
  this.after();
 }
 private void before(){
  System.out.println("Before");
 }
 private void after(){
  System.out.println("After");
 }
}

3>測(cè)試

public class Main {
 public static void main(String[] args) throws Exception {
  HelloTarget target = new HelloTarget(); 
    HelloProxy proxy= new HelloProxy(target);
  proxy.sayHello("LZHL");
 }
}

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

動(dòng)態(tài)代理的代理類是在程序運(yùn)行期間動(dòng)態(tài)生成的,也有兩種實(shí)現(xiàn),一種是JDK動(dòng)態(tài)代理,一種是CGLib動(dòng)態(tài)代理

1》JDK動(dòng)態(tài)代理(基于接口實(shí)現(xiàn),與目標(biāo)類實(shí)現(xiàn)相同接口,從而保證功能一致)

/**
 * @Author LZHL
 * @Create 2017-02-19 12:46
 * @Description
 */
public class Main {
 public static void main(String[] args){
  final HelloImpl target = new HelloImpl();
  Object proxyInstance = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
   /*
    * proxy: 代理對(duì)象
    * method: 目標(biāo)對(duì)象的方法對(duì)象
    * args: 目標(biāo)對(duì)象方法的參數(shù)
    * return: 目標(biāo)對(duì)象方法的返回值
    */
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("before");
    Object retValue = method.invoke(target, args);
    System.out.println("after");
    return retValue;
   }
  });
  Hello proxy = (Hello) proxyInstance;
  proxy.say("LYX");
  //可以把InvocationHandler提取出來,單獨(dú)寫一個(gè)類,為了方便大家看,這里我用內(nèi)部類的形式
  class JDKProxy implements InvocationHandler {
   private Object target;
   public JDKProxy(Object target){
    this.target = target;
   }
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    before();
    Object result = method.invoke(target, args);
    after();
    return result;
   }
   private void before(){
    System.out.println("Before");
   }
   private void after(){
    System.out.println("After");
   }
  }
  InvocationHandler ih = new JDKProxy(target);
  Object proxyInstance2 = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), ih);
  Hello proxy2 = (Hello) proxyInstance2;
  proxy2.say("LZHL");
 }
}

2》CGLib動(dòng)態(tài)代理(基于目標(biāo)類,通過繼承目標(biāo)類,從而保證功能一致),需要導(dǎo)入cglib-3.2.4.jar包

pom.xml

<dependencies>
 <!-- https://mvnrepository.com/artifact/cglib/cglib -->
 <dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.2.4</version>
 </dependency>
</dependencies>

1)目標(biāo)類

public class Hi {
 public void sayHi(String msg){
  System.out.println("Hi,"+msg);
 }
}

2)測(cè)試

/**
 * @Author LZHL
 * @Create 2017-02-19 13:19
 * @Description
 */
public class Main {
 public static void main(String[] args) {
  Enhancer enhancer = new Enhancer();
  //設(shè)置父類
  enhancer.setSuperclass(Hi.class);
  //設(shè)置回調(diào)函數(shù)
  enhancer.setCallback(new MethodInterceptor() {
   public Object intercept(Object target, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
    System.out.println("before");
    Object retValue = methodProxy.invokeSuper(target, args);
    System.out.println("after");
    return retValue;
   }
  });
  Object proxy = enhancer.create();
  Hi hi = (Hi) proxy;
  hi.sayHi("LXY");
  //可以把MethodInterceptor提取出來,單獨(dú)寫一個(gè)類,為了方便大家看,這里我用內(nèi)部類的形式
  class CGLibProxy implements MethodInterceptor {
   public <T> T getProxy(Class<T> clazz){
    return (T) Enhancer.create(clazz, this);
   }
   public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    before();
    Object result = proxy.invokeSuper(target, args);
    after();
    return result;
   }
   private void before(){
    System.out.println("Before");
   }
   private void after(){
    System.out.println("After");
   }
  }
  CGLibProxy cgLibProxy = new CGLibProxy();
  Hi hi2 = cgLibProxy.getProxy(Hi.class);
  hi2.sayHi("LZHL");
 }
}

以上所述是小編給大家介紹的Java靜態(tài)代理和動(dòng)態(tài)代理總結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • 淺談JVM中的JOL

    淺談JVM中的JOL

    我們天天都在使用java來new對(duì)象,但估計(jì)很少有人知道new出來的對(duì)象到底長(zhǎng)的什么樣子?對(duì)于普通的java程序員來說,可能從來沒有考慮過java中對(duì)象的問題,不懂這些也可以寫好代碼。今天,給大家介紹一款工具JOL,可以滿足大家對(duì)java對(duì)象的所有想象。
    2021-06-06
  • Jenkins遠(yuǎn)程部署war包過程圖解

    Jenkins遠(yuǎn)程部署war包過程圖解

    這篇文章主要介紹了Jenkins遠(yuǎn)程部署war包過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Spring中注解方式的異步請(qǐng)求

    Spring中注解方式的異步請(qǐng)求

    今天給大家整理了Spring中注解方式的異步請(qǐng)求的知識(shí)點(diǎn),對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • 淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化

    淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化

    這篇文章主要介紹了淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • 詳解Java中的ReentrantLock鎖

    詳解Java中的ReentrantLock鎖

    這篇文章主要介紹了Java中ReentrantLock鎖的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法詳解

    Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法詳解

    這篇文章主要介紹了Java使用JDBC實(shí)現(xiàn)Oracle用戶認(rèn)證的方法,結(jié)合實(shí)例形式分析了java使用jdbc實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接、建表、添加用戶、用戶認(rèn)證等操作流程與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • springboot配置加密的正確姿勢(shì)分享

    springboot配置加密的正確姿勢(shì)分享

    在Spring boot開發(fā)中,需要在application.yml文件里配置數(shù)據(jù)庫(kù)的連接信息,或者在啟動(dòng)時(shí)傳入數(shù)據(jù)庫(kù)密碼,如果不加密,傳明文,數(shù)據(jù)庫(kù)就直接暴露了,下面這篇文章主要給大家介紹了關(guān)于springboot配置加密的正確姿勢(shì),需要的朋友可以參考下
    2022-11-11
  • Go Java算法之外觀數(shù)列實(shí)現(xiàn)方法示例詳解

    Go Java算法之外觀數(shù)列實(shí)現(xiàn)方法示例詳解

    這篇文章主要為大家介紹了Go Java算法外觀數(shù)列實(shí)現(xiàn)的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 詳解spring cloud config整合gitlab搭建分布式的配置中心

    詳解spring cloud config整合gitlab搭建分布式的配置中心

    這篇文章主要介紹了詳解spring cloud config整合gitlab搭建分布式的配置中心,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Spring中的代理ProxyFactory解析

    Spring中的代理ProxyFactory解析

    這篇文章主要介紹了Spring中的ProxyFactory解析,在Java中,代理模式的實(shí)現(xiàn)通常依靠Proxy類和InvocationHandler接口,本文將介紹如何使用ProxyFactory來創(chuàng)建代理模式,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

衡山县| 湘西| 南通市| 东源县| 汤原县| 凌云县| 苗栗县| 铁力市| 抚顺县| 额济纳旗| 通许县| 贺州市| 丽江市| 竹溪县| 陕西省| 锦州市| 大宁县| 阿合奇县| 洛南县| 岳阳市| 札达县| 南阳市| 东光县| 普定县| 延吉市| 安塞县| 顺昌县| 隆尧县| 太和县| 定襄县| 京山县| 比如县| 宣化县| 大连市| 六安市| 驻马店市| 宁安市| 荥阳市| 谢通门县| 巴彦县| 连云港市|