Dynamic Proxy (动态代理模式)
2024-09-28 15:22:14
动态代理(运行期行为)主要有一个 Proxy类 和一个 InvocationHandler接口
动态代理角色:
1. 抽象主题角色
2. 真实主题角色(实现了抽象主题接口)
3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)
Proxy 要调用 newProxyInstance方法
代码演示:
1.抽象主题角色 SubjectDemo.java
- package com.dynamicproxy ;
- public interface SubjectDemo
- {
- public void request() ;
- }
2. 真实主题角色 RealSubjectDemo.java
- package com.dynamicproxy ;
- public class RealSubjectDemo implements SubjectDemo
- {
- public void request()
- {
- System.out.println("实现了某请求") ;
- }
- }
3. 动态代理主题角色 DynamicProxySubjectDemo.java
- package com.dynamicproxy ;
- import java.lang.reflect.InvocationHandler ;
- import java.lang.reflect.Method ;
- public class DynamicProxySubjectDemo implements InvocationHandler
- {
- private Object sub ;
- public DynamicProxySubjectDemo(Object obj)
- {
- this.sub = obj ;
- }
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
- {
- System.out.println("before"+method) ;
- method.invoke(sub, args) ;//真实的调用方法操作
- System.out.println("after"+method) ;
- return null ;
- }
- }
4.客户端 Client.java
- package com.dynamicproxy ;
- import java.lang.reflect.InvocationHandler ;
- import java.lang.reflect.Proxy ;
- public class Client
- {
- public static void main(String[] args)
- {
- RealSubjectDemo rsd = new RealSubjectDemo() ;
- InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;
- Class<?> classType = handler.getClass() ;
- // classType.getClassLoader() 动态代理类的类加载器
- //rsd.getClass().getInterfaces() 代理类要实现的接口列表
- //handler 指派方法调用的调用处理程序
- SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;
- //这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)
- //执行invoke方法
- sd.request() ;
- }
- }
最新文章
- python中协程
- C语言static
- [Unity] Shader(着色器)之纹理贴图
- js定义对象的几种容易犯的错误
- C#自定义属性(跟成员变量的区别)
- 在Linux中安装JDK的步骤
- Android -- 自定义ImageView(圆形头像)
- ios基础篇(十八)——Delegate 、NSNotification 和 KVO用法及其区别
- AppCompat学习(1)-AppCompatSpinner
- Android笔记:C memory copy
- 377. Combination Sum IV——DP本质:针对结果的迭代,dp[ans] <;= dp[ans-i] &; dp[i] 找三者关系 思考问题的维度+1,除了数据集迭代还有考虑结果
- [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
- Android进阶笔记13:RoboBinding(实现了数据绑定 Presentation Model(MVVM) 模式的Android开源框架)
- android单选按钮选择,RadioGroup,radioButton
- js实现文本框或文本域在用户输入时(oninput)触发事件,操作元素
- 基于Unity的Profiler性能分析
- 【IE6的疯狂之十一】CSS的优先级及!important在IE6下的BUG
- Python的列表
- HDU - 1430 魔板 (bfs预处理 + 康托)
- xshell 使用命令上传、下载文件
热门文章
- [BZOJ2431][HAOI2009]逆序对数列(DP)
- Educational Codeforces Round 43 (Rated for Div. 2) ABCDE
- 在活动之间切换(隐式Intent)
- poj 2001 trie
- mvc 从客户端 中检测到有潜在危险的 Request.Form 值
- Java之多线程 Semaphore(信号量)
- 提示框框架KVNProgress介绍
- animate()--jq动画
- 2014 百度之星 题解 1004 Labyrinth
- GoF设计模式三作者15年后再谈模式