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

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

  hot3.png

动态代理:即JAVA在运行时,动态的创建代理类。

使用动态代理,实现接口与实现类可以不直接发送联系,在运行期,实现动态的关联关系。

主要使用JAVA的反射技术,使用的接口InvocationHandler,代理类Proxy

具体实现的代码如下:

 

package com.mkf.pattern;public interface InterfaceOne {	public void operation();}package com.mkf.pattern.impl;import com.mkf.pattern.InterfaceOne;public class Source implements InterfaceOne {	@Override	public void operation() {		System.out.println("源被调用:" + Source.class.getName());	}}package com.mkf.pattern.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class DynamicProxy implements InvocationHandler {	private Object sourceed;	public DynamicProxy(Object sourceed) {		super();		this.sourceed = sourceed;	}	@Override	public Object invoke(Object proxy, Method method, Object[] args)			throws Throwable {		System.out.println("代理对象" + proxy.getClass().getName());		Object result;		result = method.invoke(this.sourceed, args);		return result;	}}package com.mkf;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import com.mkf.pattern.InterfaceOne;import com.mkf.pattern.impl.Source;import com.mkf.pattern.proxy.DynamicProxy;public class TestDynamicProxy {	/**	 * @param args	 */	public static void main(String[] args) {		InterfaceOne io = new Source();				InvocationHandler iHandler = new DynamicProxy(io);				//获得代理对象		Class
clazz = Proxy.getProxyClass(io.getClass().getClassLoader(), io.getClass().getInterfaces()); try { Constructor
c = clazz.getConstructor( new Class[]{InvocationHandler.class}); InterfaceOne ioOne = (InterfaceOne)c.newInstance(new Object[]{iHandler}); System.out.println("产生的动态代理对象 : " + ioOne.getClass().getName()); ioOne.operation(); } catch (Exception e) { } System.out.println("---------------------------------------------"); Object obj = Proxy.newProxyInstance(io.getClass().getClassLoader(), io.getClass().getInterfaces(), iHandler); System.out.println("获得源对象: " + obj); InterfaceOne ioOne = (InterfaceOne)obj; System.out.println("---------------------------------------------"); ioOne.operation(); System.out.println("---------------------------------------------"); iHandler = Proxy.getInvocationHandler(obj); System.out.println(iHandler.getClass().getName()); System.out.println(iHandler); }}

执行结果为:

产生的动态代理对象 : $Proxy0

代理对象$Proxy0
源被调用:com.mkf.pattern.impl.Source
---------------------------------------------
代理对象$Proxy0
获得源对象:  com.mkf.pattern.impl.Source@10d448
---------------------------------------------
代理对象$Proxy0
源被调用:com.mkf.pattern.impl.Source
---------------------------------------------
com.mkf.pattern.proxy.DynamicProxy
com.mkf.pattern.proxy.DynamicProxy@e0e1c6

转载于:https://my.oschina.net/returnspace/blog/50919

你可能感兴趣的文章
甘肃临夏扶贫贷款助贫困农户“无牛羊不成家”
查看>>
用于分层强化学习的随机神经网络
查看>>
细数GitHub 上既有趣又有用的 Java 项目Top14
查看>>
snabbdom 源码阅读分析
查看>>
业务增长400%,Uber如何快准稳扩容HDFS集群?
查看>>
读Zepto源码之样式操作
查看>>
深入理解ES6--3.函数
查看>>
手把手、脑把脑教你实现一个无限循环的轮播控件
查看>>
深度有趣 | 02 准备工作
查看>>
基于校园一卡通和WIFI使用记录的数据分析和可视化
查看>>
针对现代 Android 更新游戏 API 等级
查看>>
Netty入门
查看>>
基于vue-cli重构多页面脚手架
查看>>
MobX入门
查看>>
知多一点 webpack 的 CommonsChunkPlugin
查看>>
Nodejs教程02:response.write
查看>>
如何优雅地改善程序中for循环
查看>>
整理js 框架里面常用正则
查看>>
终于有人把Java内存模型说清楚了!
查看>>
Linux第一篇【介绍、安装Ubuntu、基本目录结构】
查看>>