《Java编程思想》学习笔记6——Java动态代理

来源:互联网 发布:淘宝几单才能一颗心 编辑:程序博客网 时间:2024/06/07 08:30

代理是一种常用的程序设计模式,如同网络代理一样,代理是介于调用者和真正调用目标对象之间的中间对象,代理在调用真正目标对象时提供一些额外或者不同的操作,真正的对目标对象的操作还是通过代理调用目标对象来完成。

    简单的代理例子如下:

[java] view plaincopy
  1. //接口  
  2. interface Interface{  
  3.     void doSomething();  
  4.     void somethingElse(String arg);  
  5. }  
  6. //目标对象  
  7. class RealObject implement Interface{  
  8.     public void doSomething(){  
  9.         System.out.println(“RealObject doSomething”);  
  10. }  
  11. public void somethingElse(String arg){  
  12.     System.out.println(“RealObject somethingElse ” + arg);  
  13. }  
  14. }  
  15. //简单代理对象  
  16. class SimpleProxy implements Interface(  
  17.     private Interface proxied;  
  18.     public SimpleProxy(Interface proxied){  
  19.         this.proxied = proxied;  
  20. }  
  21. public void doSomething(){  
  22.     System.out.println(“SimpleProxy doSomething”);  
  23.     proxied.doSomething();  
  24. }  
  25. public void somethingElse(String arg){  
  26.     System.out.println(“SimpleProxy somethingElse ” + arg);  
  27.     proxied.somethingElse(arg);  
  28. }  
  29. )  
  30. Class SimpleProxyDemo{  
  31.     public static void consumer(Interface iface){  
  32.         iface.doSomething();  
  33.         iface.somethingElse(“TestProxy”);  
  34. }  
  35. public static void main(String[] args){  
  36. //不是用代理  
  37.     cosumer(new RealObject());  
  38.     //使用代理  
  39.     cosumer(new SimpleProxy(new RealObject()));  
  40. }  
  41. }  

输出结果为:

RealObject doSomething

RealObjectsomethingElse TestProxy

SimpleProxy doSomething

RealObject doSomething

SimpleProxy somethingElse TestProxy

RealObject somethingElse TestProxy

上面例子可以看出代理SimpleProxy在调用目标对象目标方法之前做了一些额外的操作。

Java中的代理是针对接口的动态代理,当然java也可以使用第三方的CGLIB实现针对类的代理,但是JDK中只支持针对接口的动态代理,我们只分析JDK的动态代理。

JDK动态代理的要素:

(1).实现了InvocationHandler的代理处理类,实现其invoke方法,该方法是代理调用目标对象方法以及提供额外操作的方法。

(2).使用Proxy.newProxyInstance(类加载器, 代理接口列表,InvocationHandler对象);方法创建实现了指定接口的动态代理。

JDK的代理例子如下:

[java] view plaincopy
  1. //接口  
  2. interface Interface{  
  3.     void doSomething();  
  4.     void somethingElse(String arg);  
  5. }  
  6. //目标对象  
  7. class RealObject implement Interface{  
  8.     public void doSomething(){  
  9.         System.out.println(“RealObject doSomething”);  
  10. }  
  11. public void somethingElse(String arg){  
  12.     System.out.println(“RealObject somethingElse ” + arg);  
  13. }  
  14. }  
  15. //代理处理类  
  16. class DynamicProxyHandler implements InvocationHandler{  
  17.     provate Object proxied;  
  18.     public DynamicProxyHandler(Object proxied){  
  19.         this.proxied = proxied;  
  20. }  
  21. //动态代理调用目标对象的方法  
  22. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{  
  23.     System.out.println(“Dynamic proxy invoke”);  
  24.     return method.invoke(proxied, args);  
  25. }  
  26. }  
  27. class SimpleDynamicProxy{  
  28.     public static void consumer(Interface iface){  
  29.         iface.doSomething();  
  30.         iface.somethingElse(“DynamicProxy”);  
  31. }  
  32. public static void main(String[] args){  
  33.     RealObject real = new RealObject();  
  34.     //不是用代理  
  35.     consumer(real);  
  36.     //创建动态代理  
  37.     Interface proxy = (Interface) Proxy.newProxyInstance(  
  38.                     Interface.class.getClassLoader(),  
  39.                     new Class[]{Interface.class},  
  40.                     new DynamicProxyHandler(real)  
  41. );  
  42.        cosumer(proxy);  
  43. }   
  44. }  

输出结果为:

RealObject doSomething

RealObject somethingElse DynamicProxy

Dynamic proxy invoke

RealObject doSomething

Dynamic proxyinvoke       

RealObject somethingElse DynamicProxy

0 0