java 动态代理

1.抽象角色(之前是抽象类,此处应改为接口)   

Java代码  收藏代码
  1. public interface Subject     
  2. {     
  3.     public void request();     
  4. }  


2.具体角色  

Java代码  收藏代码
  1. public class RealSubject implements Subject     
  2. {     
  3.     
  4.     public RealSubject()     
  5.     {     
  6.     }     
  7.     
  8.     public void request()     
  9.     {     
  10.         System.out.println("真正做事的。");     
  11.     }     
  12. }  



3.代理处理器   
/**  
* 该代理类的内部属性为Object类,实际使用时通过该类的构造函数DynamicSubject(Object obj)对其赋值;  
* 此外,在该类还实现了invoke方法,该方法中的 method.invoke(sub,args);  
* 其实就是调用被代理对象的将要被执行的方法,方法参数sub是实际的被代理对象,  
* args为执行被代理对象相应操作所需的参数。  
* 通过动态代理类,我们可以在调用之前或之后执行一些相关操作  
*/  

Java代码  收藏代码
  1.    
  2. public class DynamicSubject implements InvocationHandler     
  3. {     
  4.     private Object sub;     
  5.     
  6.     public DynamicSubject()     
  7.     {     
  8.     }     
  9.     
  10.     public DynamicSubject(Object obj)     
  11.     {     
  12.         sub = obj;     
  13.     }     
  14.     
  15.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable     
  16.     {     
  17.         System.out.println("调用前" + method);     
  18.     
  19.         method.invoke(sub, args);     
  20.     
  21.         System.out.println("调用后 " + method);     
  22.     
  23.         return null;     
  24.     }     



4.客户端 

Java代码  收藏代码
    1. public class Client     
    2. {     
    3.     static public void main(String[] args) throws Throwable     
    4.     {     
    5.     
    6.         RealSubject rs = new RealSubject(); // 在这里指定被代理类     
    7.         InvocationHandler ds = new DynamicSubject(rs);     
    8.         Class<?> cls = rs.getClass();     
    9.     
    10.         // 以下是一次性生成代理     
    11.     
    12.         Subject subject = (Subject) Proxy.newProxyInstance(     
    13.                 cls.getClassLoader(), cls.getInterfaces(), ds);     
    14.     
    15.         subject.request();     
    16.     }     
    17. }  
原文地址:https://www.cnblogs.com/fx2008/p/3569467.html