动态代理(运行期行为)主要有一个 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. }

最新文章

  1. python中协程
  2. C语言static
  3. [Unity] Shader(着色器)之纹理贴图
  4. js定义对象的几种容易犯的错误
  5. C#自定义属性(跟成员变量的区别)
  6. 在Linux中安装JDK的步骤
  7. Android -- 自定义ImageView(圆形头像)
  8. ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别
  9. AppCompat学习(1)-AppCompatSpinner
  10. Android笔记:C memory copy
  11. 377. Combination Sum IV——DP本质:针对结果的迭代,dp[ans] &lt;= dp[ans-i] &amp; dp[i] 找三者关系 思考问题的维度+1,除了数据集迭代还有考虑结果
  12. [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
  13. Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)
  14. android单选按钮选择,RadioGroup,radioButton
  15. js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
  16. 基于Unity的Profiler性能分析
  17. 【IE6的疯狂之十一】CSS的优先级及!important在IE6下的BUG
  18. Python的列表
  19. HDU - 1430 魔板 (bfs预处理 + 康托)
  20. xshell 使用命令上传、下载文件

热门文章

  1. [BZOJ2431][HAOI2009]逆序对数列(DP)
  2. Educational Codeforces Round 43 (Rated for Div. 2) ABCDE
  3. 在活动之间切换(隐式Intent)
  4. poj 2001 trie
  5. mvc 从客户端 中检测到有潜在危险的 Request.Form 值
  6. Java之多线程 Semaphore(信号量)
  7. 提示框框架KVNProgress介绍
  8. animate()--jq动画
  9. 2014 百度之星 题解 1004 Labyrinth
  10. GoF设计模式三作者15年后再谈模式