动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理
为什么80%的码农都做不了架构师?>>>
一:在看此篇代码示例前,先看静态代理,
链接地址: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
动态代理,动态代理设计模式 ,JDK动态代理,cglib动态代理相关推荐
- Java提高班(六)反射和动态代理(JDK Proxy和Cglib)
反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...
- 静态代理,JDK动态代理,Cglib动态代理详解
目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...
- spring框架中JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...
- jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor
动态代理是为了实现Aop编程(不修改类源码,类方法执行前后,自定义增强处理, 日志 拦截等等),代理的是类对象 一.jdk动态代理 被代理的类需要实现接口,针对接口的代理,通过生成一个实现了接口的动态 ...
- JDK和CGLIB动态代理区别
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 Github:https://github.com/yihonglei/thinking-in ...
- 利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...
作者:爱宝贝丶来源:https://my.oschina.net/zhangxufeng/blog/1633187 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和 ...
- Spring的两种代理方式:JDK动态代理和CGLIB动态代理
代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者 ...
- 谁与争锋,JDK动态代理大战CGLib动态代理
文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...
- Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现
AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...
- Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理
前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...
最新文章
- Silverlight 开发入门1
- vfp字符转换数值_JS数据类型转换与字面量
- linux特殊权限位之setuid、setgid和sticky
- python3.6字典有序_为什么Python 3.6以后字典有序并且效率更高?
- Java输入若干整数(不少于10个),用–1结束输入,以每行三个数的形式输出,再从这些数中选出所有奇数放在另一个数组中,然后输出.
- sdutacm 1566 幸运数(bfs)
- python作品代码_学习python的一些心得体会
- STM8S——Analog/digital converter (ADC)
- Windows11安装JDK
- mina框架CumulativeProtocolDecoder.doDecode方法浅析
- php代码实现微信代扣,html5+如何通过native.js实现APP微信支付代扣签约?
- 第512章 河系量子计算机,分身投胎万界(猛虎道长著)_第512章、河系量子计算机_历史军事小说_笔趣阁...
- 电场强度 高斯定理 习题
- 我被感动了!世间自有真爱 - 林林与静静
- matlab2015 colormap,matlab中colormap函数
- 罗德里格旋转公式推导(自制)
- keycloak 验证 token
- 图像处理之Matlab图像读取
- Android指南针应用
- jacky自问自答-java并发编程
热门文章
- HMM——前向算法与后向算法
- 隐马尔科夫模型——简介
- Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服务器上安装配置及卸载重新安装(已测试可执行)
- 1.Consul 简介和环境搭建
- 《剑指offer》第四十三题(从1到n整数中1出现的次数)
- react-webpack config webpack@3.4.1
- zabbix 从入门到精通
- angular中封装fancyBox(图片预览)
- 数据对拍代码 c++
- 基于RBGD的mapping