JDK动态代理

JDK动态代理

首先我们来了解一下java中的代理模式,代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

1抽象主题角色

    声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题

2代理主题(Proxy)角色:

     代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。

3真实主题角色

定义了代理角色所代表地真实对象

   JDK动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理.下面通过一个(男朋友要和女朋友分手)案例讲解JDK动态代理的实现.

1、创建一个接口

  1. package www.csdn.spring.jdk.proxy;  
  2.   
  3. //抽象主题 角色  
  4.   
  5. public interface SayGoodBye {  
  6.   
  7. /** 
  8.  
  9.  * 说的内容 
  10.  
  11.  * @param content 
  12.  
  13.  */  
  14.   
  15. public void say(String content);  
  16.   
  17. }  

2、创建接口的实现类。
  1. package www.csdn.spring.jdk.proxy;  
  2.   
  3. //这是主题角色  
  4.   
  5. public class SayGoodByeImpl implements SayGoodBye {  
  6.   
  7. @Override  
  8. public void say(String content) {  
  9. System.out.println("say:" + content);  
  10. }  
  11.   
  12. }  


3、测试说明

  1. package www.csdn.spring.jdk.proxy;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. public class TestSay {  
  6.   
  7. @Test  
  8.   
  9. public void say(){  
  10.   
  11. //创建对象  
  12. SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();  
  13.   
  14. //调用say方法  
  15. sayGoodByeImpl.say("咱们分手吧!");  
  16.   
  17. }  
  18. }  

分析说明:上面创建 SayGoodByeImpl 的实例,调用了say方法,相当于男朋友自己给女朋友说咱们分手吧.但是男朋友不想和自己的女朋友直接说,想找一个中间人来说。那么就要使用到了代理。下面创建这样的代理类:

4、代理类

  1. package www.csdn.spring.jdk.proxy;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4.   
  5. import java.lang.reflect.Method;  
  6.   
  7. import java.lang.reflect.Proxy;  
  8.   
  9. /** 
  10.  
  11.  * JDK动态代理 
  12.  
  13.  * @author redarmy 
  14.  
  15.  
  16.  */  
  17.   
  18. public class JDKProxy implements InvocationHandler {  
  19.   
  20. // 代理目标对象  
  21. private Object target;  
  22.   
  23. // 创建目标对象的的代理对象  
  24. public  Object createProxyInstance(Object target) {  
  25. this.target = target;// 代理的目标对象  
  26. // 创建代理对象  
  27. // 1、定义代理类的类加载器  
  28. // 2、代理类要实现的接口列表  
  29. // 3、 指派方法调用的调用处理程序  
  30. return Proxy.newProxyInstance(target.getClass().getClassLoader(),  
  31. target.getClass().getInterfaces(), this);  
  32.   
  33. }  
  34. /** 
  35. * proxy:目标对象的代理实例method:对于代理实例调用接口方法的Method实例args:方法参数 
  36. */  
  37.   
  38. @Override  
  39. public Object invoke(Object proxy, Method method, Object[] args)  
  40. throws Throwable {  
  41.   
  42. // 声明返回值  
  43. Object returnValue = null;  
  44. beforeMethod();  
  45. // 执行目标方法  
  46. returnValue = method.invoke(target, args);  
  47. afterMethod();  
  48. // 修改返回值  
  49. return returnValue;  
  50.   
  51. }  
  52.   
  53. public void beforeMethod(){  
  54.   
  55. System.out.println("---------------------目标方法之前执行");  
  56.   
  57. }  
  58.   
  59. public void afterMethod(){  
  60.   
  61. System.out.println("---------------------目标方法之后执行");  
  62.   
  63. }  
  64.   
  65. }  
5、测试说明
  1. <pre name="code" class="java">package www.csdn.spring.jdk.proxy;  
  2.   
  3. import org.junit.Test;  
  4.   
  5. public class TestSay {  
  6.   
  7. @Test  
  8.   
  9. public void say(){  
  10.   
  11. //真实主题角色  
  12. SayGoodByeImpl sayGoodByeImpl = new SayGoodByeImpl();  
  13.   
  14. //代理角色  
  15. JDKProxy jdkProxy = new JDKProxy();  
  16. SayGoodBye sayProxy = (SayGoodBye) jdkProxy.createProxyInstance(sayGoodByeImpl);  
  17.   
  18. //代理说:  
  19. sayProxy.say("你和他分手吧!!!");  
  20.   
  21. }  
  22. }</pre>  
  23. <pre></pre>  
  24. <p></p>  
  25. <pre></pre>  
  26. <p></p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值