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

动态代理角色:

1. 抽象主题角色

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

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

Proxy 要调用 newProxyInstance方法

代码演示:

1.抽象主题角色 SubjectDemo.java

  1. package com.dynamicproxy ;
  2. public interface SubjectDemo
  3. {
  4. public void request() ;
  5. }

2. 真实主题角色 RealSubjectDemo.java

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

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

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

4.客户端 Client.java

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