动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理

为什么80%的码农都做不了架构师?>>>   hot3.png

一:在看此篇代码示例前,先看静态代理,

链接地址:http://my.oschina.net/dyyweb/blog/656760    (代码示例)

二:JDK动态代理

动态代理与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力

/***定义一种类型的女人,王婆和潘金莲都属于这个类型的女人*/
public interface KindWoman {//这种女人能做什么事情呢?public void makeEyesWithMan();//抛媚眼public void happyWithMan();//和男人那个....
}



/*** 潘金莲*/
public class PanJinLian  implements KindWoman{@Overridepublic void happyWithMan() {System.out.println("潘金莲和男人在做那个...");}@Overridepublic void makeEyesWithMan() {System.out.println("潘金莲抛媚眼...");}
}



/*** 那我们再考虑一下,水浒里面还有没有这类型的女人?* 有,卢俊义的老婆贾氏(就是和那个管家苟合的那个),这个名字起的:“贾氏”,那我们也让王婆做她的代理:*/
public class JiaShi implements KindWoman{@Overridepublic void happyWithMan() {System.out.println("贾氏和男人在做那个...");}@Overridepublic void makeEyesWithMan() {System.out.println("贾氏抛媚眼...");}
}



/*** jdk动态代理** 王婆变身动态代理*/
public class WangPoProxy implements InvocationHandler{private Object target;//绑定委托对象并返回一个代理类public Object createProxyTarget(Object target){this.target = target;//取得代理对象,要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.err.println("+++++++++开始切入++++++++++++");Object result=method.invoke(target, args);   //执行方法System.err.println("+++++++++++结束切入++++++++++");return result;}
}



public class XiMenQiang {public static void main(String[] args) {//王婆出厂WangPoProxy wangPo =  new WangPoProxy();//潘金莲出场PanJinLian panJinLian  = new PanJinLian();//告王婆代理潘金莲苟且之事KindWoman woman = (KindWoman) wangPo.createProxyTarget(panJinLian);//然后西门庆说,我要和潘金莲Happy,然后王婆就安排了西门庆丢筷子哪出戏:woman.makeEyesWithMan();//看到没有表面是王婆在做,其实爽的是潘金莲woman.happyWithMan();//西门庆勾引贾氏JiaShi jiaShi = new JiaShi();woman = (KindWoman) wangPo.createProxyTarget(jiaShi);woman.makeEyesWithMan();woman.happyWithMan();}
}



JDK动态代理中包含一个类和一个接口: 
InvocationHandler接口: 
public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 

参数说明: 
Object proxy:指被代理的对象。 
Method method:要调用的方法 
Object[] args:方法调用时所需要的参数 

可以将InvocationHandler接口的子类想象成一个代理的最终操作类,替换掉ProxySubject。 

Proxy类: 
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法: 
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, 
InvocationHandler h) 
                               throws IllegalArgumentException 
参数说明: 
ClassLoader loader:类加载器 
Class<?>[] interfaces:得到全部的接口 
InvocationHandler h:得到InvocationHandler接口的子类实例 

Ps:类加载器 
在Proxy类中的newProxyInstance()方法中需要一个ClassLoader类的实例,ClassLoader实际上对应的是类加载器,在Java中主要有一下三种类加载器; 
Booststrap ClassLoader:此加载器采用C++编写,一般开发中是看不到的; 
Extendsion ClassLoader:用来进行扩展类的加载,一般对应的是jre\lib\ext目录中的类; 
AppClassLoader:(默认)加载classpath指定的类,是最常使用的是一种加载器。 

三:

但是,JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了。 

Cglib动态代理 
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。 

这里用了两个jar,asm-3.3.1.jar 和cglib-2.2.2.jar 注意版本号哦,不然坑

/**** 相信你一定也知道水浒传的拼命三郎石秀吧,他的结拜兄弟杨雄的老婆,潘云巧也是个水性杨花的女人* 他和师兄(一个和尚偷情)*/
public class PanYunQiao {public void betrayal(){System.out.println("正在和和尚偷情...");}
}



*** cglib动态代理** 王婆变身动态代理** cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。*/
public class WangPoCglibProxy implements MethodInterceptor {private Object target;/*** 创建代理对象** @param target* @return*/public Object getInstance(Object target) {this.target = target;Enhancer enhancer = new Enhancer();enhancer.setSuperclass(this.target.getClass());// 回调方法enhancer.setCallback(this);// 创建代理对象return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.err.println("+++++++++cglib开始切入++++++++++++");methodProxy.invokeSuper(obj, args);System.err.println("+++++++++++cglib结束切入++++++++++");return null;}
}



/*** cglib动态代理*/WangPoCglibProxy wangPoCglibProxy = new WangPoCglibProxy();PanYunQiao panYunQiao = new PanYunQiao();PanYunQiao pan = (PanYunQiao) wangPoCglibProxy.getInstance(panYunQiao);pan.betrayal();




转载于:https://my.oschina.net/dyyweb/blog/659462

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言扫雷游戏简单实现

文章目录前言一、代码思路二、代码实现1.引入库2.具体代码见以下链接&#xff0c;免费下载&#xff0c;无需慌张3.运行结果前言 本篇文章为使用C语言的easyX库函数实现扫雷小游戏 一、代码思路 1.设置扫雷地图 用一个二维数组表示扫雷地图 初始化二维数组 埋雷&#xff0c;-1…

单维度量表验证性因子分析_验证性因素分析介绍

在进行研究的过程中&#xff0c;为了达成研究目的&#xff0c;往往会考虑多个变量对结果的影响&#xff0c;而这许多个的变量由于其背后所蕴藏的“共同因素”使其具有较高的相关性。通过因子分析(factor analysis)技术&#xff0c;我们可以将其简化&#xff0c;并在损失最少信息…

计算方法之迭代法求方程根

/************************ * 用迭代法求方程 * f(x)e^(-x)-x10 * 的根 *************************/ #include<stdio.h> #include<math.h> #include<conio.h>float fa(float); float dd(float); int main() {float x0;printf("input data x0 ");s…

VS2010中C#添加图片(资源)

做工具栏的时候要用到图片。图标这样的东西从文件夹里导入显得有些山寨。VS的图形化操作很方便。但是我们的程序要动态载入图标。所以不能拖拽了~ 下面是添加图片的方法&#xff1a; 1》右击项目 》 属性 选择资源选项卡 如果没有资源的话&#xff0c;显示右上图。点击创建一个…

字符串左旋问题及判断一个字符串是否由另一个字符串左旋得到

字符串左旋问题 问题描述 左旋字符串中的k个字符。例如 ABCD左旋一个字符得到BCDA &#xff0c;ABCD左旋两个字符得到CDAB 解法一&#xff1a;暴力破解法 先左旋一个字符 将字符串首个字符保存在temp中 字符串其余字符向左移动一个单位将temp中保存的字符放到字符串结尾 重复…

MySql连接异常解决

这两天遇到一个mysql连接的问题&#xff0c;找人弄了好几天也没弄好&#xff0c;先看一下报错信息&#xff1a; org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.e…

js映射 nginx_浅析nginx刚刚发布的JavaScript能力nginScript

背景2015年9月&#xff0c;nginx宣布支持类JavaScript语言。这意味着开发者可以更轻松、自由的控制全球最优秀的HTTP及反向代理服务器&#xff0c;并在此之上可以衍生出更多有用、好玩的创意。Nginx也更开发的走向了动态配置化的下一个阶段。大家可以点击查看 官方介绍链接 。先…

浏览器是如何工作的系列:渲染引擎

渲染引擎的功能就是渲染&#xff0c;在浏览器上显示请求的内容。 默认情况下&#xff0c;渲染引擎可以显示HTML和XML文档和图像。他也可以显示其他类型的插件(浏览器扩展)。例如显示PDF使用PDF浏览器插件。 我们将用一个特殊的章节来讨论插件和扩展。在这个章节中&#xff0c;我…

洛杉矶手机资费9.9美元包打一年

“洛杉矶的油价比中国还便宜两块钱。我就想了&#xff0c;中石油、中石化这是怎么回事啊&#xff1f;能不能换我当老总&#xff0c;试半年&#xff0c;不行我再还给你&#xff1f;” 政府工作报告语言更平实 昨日&#xff0c;政协分组讨论政府工作报告&#xff0c;小崔第二个发…

软考信息系统监理师第五次作业

一、组织协调1、组织协调的基本原则是什么&#xff08;记&#xff09;&#xff1f;&#xff08;1&#xff09;公平、公正、独立原则&#xff08;2&#xff09;守法原则&#xff08;3&#xff09;诚信原则&#xff08;4&#xff09;科学原则2、什么是科学的原则&#xff1f;科学…

杨氏矩阵问题

杨氏矩阵问题 问题描述&#xff1a; 杨氏矩阵定义&#xff1a;同行元素从左向右依次递增&#xff0c;同列元素从上到下依次递增&#xff0c;注意&#xff1a;杨氏矩阵行列数可以不相等 杨氏矩阵举例&#xff1a; 123456789 在杨氏矩阵中查找一个元素key,要求时间复杂度小于O(…

win10水印烦死了_win10系统下word去水印的方法【图文】

很多win10系统用户都会从网上下载word文档来进行修改&#xff0c;而在下载的word文档中有时候会有水印&#xff0c;而有些用户并不知道要怎么去除word中水印&#xff0c;为此win7之家小编这就给大家带来win10系统下word去水印的方法吧。方法一、1、进入「设计」-「页面背景」-「…

python中如何对dict对象进行排序

有程序&#xff1a;mydict {carl:40,alan:2,bob:1,danny:3}for key in sorted(mydict.iterkeys()):print "%s: %s" % (key, mydict[key])输出结果为&#xff1a; alan: 2 bob: 1 carl: 40 danny: 3 使用key来进行dict的排序&#xff1a; keylist mydict.keys() key…

富丽的SUSE Linux 10.3(1)

作者: hr127 出自: http://www.linuxdiyf.com版权声明&#xff1a; 原创作品&#xff0c;容许转载&#xff0c;转载时请务必以超链接编制标明文章 原始出处 、作者信息和本声明。不然将追究执法责任。 转载于:https://www.cnblogs.com/zgqjymx/archive/2011/03/07/1976023.htm…

ios CGRec用法

/*rect(x,y,width,height);width&#xff0c; height正负代表了从原点的绘制方向,矩形的长宽都是取得绝对值*/// Do any additional setup after loading the view, typically from a nib.#pragma mark -------------------------------------------生成CGRect----------------…

怎么判断子元素距离父元素顶部位置_js获取元素的距离父元素、窗口的距离offsetTop,offsetHeight,clientHeight...

前言相信很多项目中都会有这样一个小需求(PC端&#xff0c;移动端则是点击)&#xff0c;鼠标移上某个菜单或者某个位置&#xff0c;显示一个弹出框&#xff0c;移开则隐藏弹出框&#xff0c;就是css中hover效果&#xff0c;这种通常做法是每个子菜单下都有一个弹框&#xff0c;…

matlab实现同态滤波

定义 一幅图像可看成由两部分组成&#xff0c;即 fi代表随空间位置不同的亮度&#xff08;Illumination&#xff09;分量&#xff0c;其特点是缓慢变化&#xff0c;集中在图像的低频部分。fr代表景物反射到人眼的反射&#xff08;Reflectance&#xff09;分量&#xff0c;其特…

WordPress Mail Subscribe List插件‘sml_name’参数HTML注入漏洞

漏洞名称&#xff1a;WordPress Mail Subscribe List插件‘sml_name’参数HTML注入漏洞CNNVD编号&#xff1a;CNNVD-201306-205发布时间&#xff1a;2013-06-14更新时间&#xff1a;2013-06-14危害等级&#xff1a; 漏洞类型&#xff1a;输入验证威胁类型&#xff1a;远程CVE编…

大摩维持浩大游戏“增持”评级

网易科技讯 3月3日动静&#xff0c;摩根士丹利往日宣布投资陈诉&#xff0c;指出浩大游戏第四季度业绩凌驾预期&#xff0c;具有多个利好要素&#xff0c;另外该公司在Mochi Media平台方面的极力也值得垂青。因此&#xff0c;摩根士丹利维持浩大游戏“增持”的评级。以下为陈诉…

数字图像处理频域滤波实现低通与高通滤波(包含matlab代码)

低通滤波器 理想低通滤波 作用&#xff1a;保留频谱图中圆内低频分量&#xff0c;截断频谱图中圆外高频分量函数表示&#xff1a; 假设频谱中心在 (M/2,N/2)处&#xff0c;则任意频谱成分(u,v) 到中心&#xff08;原点&#xff09;的距离D(u,v) 定义为&#xff1a; D0为低通滤…