Dynamic Proxy (动态代理模式)

时间:2022-09-21 16:08:26

动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口

动态代理角色:

1. 抽象主题角色

2. 真实主题角色(实现了抽象主题接口)

3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)

Proxy 要调用 newProxyInstance方法

 

代码演示:

 

1.抽象主题角色 SubjectDemo.java

 

[java]  view plain copy
  1. package com.dynamicproxy ;  
  2.   
  3. public interface SubjectDemo  
  4. {  
  5.     public void request() ;  
  6. }  

 

2. 真实主题角色 RealSubjectDemo.java

 

[java]  view plain copy
  1. package com.dynamicproxy ;  
  2.   
  3.   
  4. public class RealSubjectDemo implements SubjectDemo  
  5. {  
  6.     public void request()  
  7.     {  
  8.         System.out.println("实现了某请求") ;  
  9.     }  
  10. }  

 

3. 动态代理主题角色 DynamicProxySubjectDemo.java

 

[java]  view plain copy
  1. package com.dynamicproxy ;  
  2.   
  3. import java.lang.reflect.InvocationHandler ;  
  4. import java.lang.reflect.Method ;  
  5.   
  6.   
  7. public class DynamicProxySubjectDemo implements InvocationHandler  
  8. {  
  9.     private Object sub ;  
  10.   
  11.     public DynamicProxySubjectDemo(Object obj)  
  12.     {  
  13.         this.sub = obj ;  
  14.     }  
  15.   
  16.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable  
  17.     {  
  18.         System.out.println("before"+method) ;  
  19.   
  20.         method.invoke(sub, args) ;//真实的调用方法操作  
  21.   
  22.         System.out.println("after"+method) ;  
  23.   
  24.         return null ;  
  25.   
  26.     }  
  27.   
  28.   
  29. }  

4.客户端 Client.java

 

[java]  view plain copy
  1. package com.dynamicproxy ;  
  2.   
  3. import java.lang.reflect.InvocationHandler ;  
  4. import java.lang.reflect.Proxy ;  
  5.   
  6. public class Client  
  7. {  
  8.     public static void main(String[] args)  
  9.     {  
  10.         RealSubjectDemo rsd = new RealSubjectDemo() ;  
  11.   
  12.         InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;  
  13.          
  14.         Class<?> classType = handler.getClass() ;  
  15.           
  16.         // classType.getClassLoader() 动态代理类的类加载器  
  17.         //rsd.getClass().getInterfaces() 代理类要实现的接口列表  
  18.         //handler 指派方法调用的调用处理程序  
  19.         SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;  
  20.           
  21.         //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)  
  22.          //执行invoke方法  
  23.         sd.request() ;  
  24.     }  
  25. }