博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态代理模式
阅读量:6281 次
发布时间:2019-06-22

本文共 2306 字,大约阅读时间需要 7 分钟。

 

 

 

 

package com.base.pattern.test;/** * 明星接口,用于给子类实现 *  * @author Wei * @time 2016年9月27日 下午9:09:46 */public interface Star {	public void actMovie();	public void sing();}

  

被代理类:

package com.base.pattern.test;/** * 真实类,需要被代理的类 *  * @author Wei * @time 2016年9月27日 下午9:09:16 */public class RealStar implements Star {	@Override	public void actMovie() {		System.out.println("RealStar actMovie");	}	@Override	public void sing() {		System.out.println("RealStar sing a song");	}}

  

被代理类的处理类:

package com.base.pattern.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import com.util.UtilTime;/** * 通过实现 InvocationHandler接口以实现动态代理 就如静态代理一样, 不管是静态代理还是动态代理,都需要传入一个被代理类 *  * @author Wei * @time 2016年9月27日 下午9:10:33 */public class StarHandler implements InvocationHandler {	// 声明一个被代理类变量,用于接收构造器里传入的被代理对象	RealStar realStar;	/**	 * 传入被代理类,	 * 	 * @param realStar	 */	public StarHandler(RealStar realStar) {		this.realStar = realStar;	}	/**	 * proxy :不能调用 toString方法,否则会陷入死循环。	 * method: 被代理类的方法,用于代码中使用反射	 * args:   被代理类的method方法需要用的参数	 */	@Override	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {		// 获取代理类的方法名		String methodName = method.getName();		System.out.println(UtilTime.getCurrentTime(null) + "将要真正执行代理的方法:" + methodName);		// 固定的写法,调用被代理类的方法		method.invoke(realStar, args);		System.out.println(UtilTime.getCurrentTime(null) + "已经执行完代理的方法:" + methodName);		System.out.println();		return null;	}}

  

测试类:

package com.base.pattern.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;/** * 代理类测试 *  * @author Wei * @time 2016年9月27日 下午10:08:08 */public class test {	public static void main(String[] args) throws InterruptedException {		RealStar realStar = new RealStar();		ClassLoader loader = realStar.getClass().getClassLoader();		Class
[] interfs = realStar.getClass().getInterfaces(); // 传入被代理类,也就是真正的明星类 InvocationHandler h = new StarHandler(realStar); // 生成代理类,这是至关重要的一步 Star proxy = (Star) Proxy.newProxyInstance(loader, interfs, h); proxy.sing(); Thread.sleep(1000); proxy.actMovie(); }}

  

控制台输出:

2016.09.27 22:07:55 CST将要真正执行代理的方法:sing

RealStar sing a song
2016.09.27 22:07:55 CST已经执行完代理的方法:sing

2016.09.27 22:07:56 CST将要真正执行代理的方法:actMovie

RealStar actMovie
2016.09.27 22:07:56 CST已经执行完代理的方法:actMovie

 

转载地址:http://myiva.baihongyu.com/

你可能感兴趣的文章
爆牙齿的Web标准面试考题II(iPhone SMS/iChat UI的Web标准实现)
查看>>
XMOVE3.0手持终端——软件介绍(二):在2KB内存的单片机上实现的彩屏GUI控件库
查看>>
MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
查看>>
找小于N 的所有质数
查看>>
Windows下的Jupyter Notebook 的介绍(写给新手)(图文详解)
查看>>
iOS开发-CocoaPods实战
查看>>
JS组件系列——Bootstrap 树控件使用经验分享
查看>>
HTML-color:rgb()-颜色渐进
查看>>
数据库实例: STOREBOOK > 表空间 > 编辑 表空间: UNDOTBS1
查看>>
Mcad学习笔记之异步编程(AsyncCallback委托,IAsyncResult接口,BeginInvoke方法,EndInvoke方法的使用小总结)...
查看>>
Javascript防冒泡事件与Event对象
查看>>
managed domain与unmanaged domain
查看>>
《设计模式解析(第2版•修订版)》目录—导读
查看>>
Java核心技术卷I基础知识3.5.3 强制类型转换
查看>>
可与Mirai比肩的恶意程序Hajime,竟是为了保护IoT设备?
查看>>
《Spring Data 官方文档》6. Cassandra 存储库
查看>>
聊聊并发(十)生产者消费者模式
查看>>
R语言数据挖掘2.2.4.2 FP-growth算法
查看>>
人工智能概念诞生60年,哪些大牛堪称“一代宗师”?
查看>>
《游戏大师Chris Crawford谈互动叙事》一9.5 真实案例
查看>>