为什么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动态代理相关推荐

  1. Java提高班(六)反射和动态代理(JDK Proxy和Cglib)

    反射和动态代理放有一定的相关性,但单纯的说动态代理是由反射机制实现的,其实是不够全面不准确的,动态代理是一种功能行为,而它的实现方法有很多.要怎么理解以上这句话,请看下文. 一.反射 反射机制是 Ja ...

  2. 静态代理,JDK动态代理,Cglib动态代理详解

    目录 一.代理模式 二.静态代理 三.动态代理 3.1 JDK动态代理 3.2 Cglib动态代理 四.两种动态代理区别 一.代理模式 代理模式(Proxy Pattern)是程序设计中的一种设计模式 ...

  3. spring框架中JDK和CGLIB动态代理区别

    转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...

  4. jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor

    动态代理是为了实现Aop编程(不修改类源码,类方法执行前后,自定义增强处理, 日志 拦截等等),代理的是类对象 一.jdk动态代理 被代理的类需要实现接口,针对接口的代理,通过生成一个实现了接口的动态 ...

  5. JDK和CGLIB动态代理区别

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 Github:https://github.com/yihonglei/thinking-in ...

  6. 利用代码分别实现jdk动态代理和cglib动态代理_代理模式实现方式及优缺点对比...

    作者:爱宝贝丶来源:https://my.oschina.net/zhangxufeng/blog/1633187 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和 ...

  7. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者 ...

  8. 谁与争锋,JDK动态代理大战CGLib动态代理

    文章目录 一.前言 二.基本概念 三.JDK 和 CGLib动态代理区别 3.1 JDK动态代理具体实现原理 3.2 CGLib动态代理 3.3 两者对比 3.4 使用注意 四.JDK 和 CGLib ...

  9. Spring AOP之---基于JDK动态代理和CGLib动态代理的AOP实现

    AOP(面向切面编程)是OOP的有益补充,它只适合那些具有横切逻辑的应用场合,如性能监测,访问控制,事物管理,日志记录等.至于怎么理解横切逻辑,敲完实例代码也就明白了. 为什么要使用AOP,举个栗子: ...

  10. Java 结合实例学会使用 静态代理、JDK动态代理、CGLIB动态代理

    前言 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 代理 很多人至今都是看到 代理就懵, 静态代理.动态代理.JDK动态代理.CGL ...

最新文章

  1. Silverlight 开发入门1
  2. vfp字符转换数值_JS数据类型转换与字面量
  3. linux特殊权限位之setuid、setgid和sticky
  4. python3.6字典有序_为什么Python 3.6以后字典有序并且效率更高?
  5. Java输入若干整数(不少于10个),用–1结束输入,以每行三个数的形式输出,再从这些数中选出所有奇数放在另一个数组中,然后输出.
  6. sdutacm 1566 幸运数(bfs)
  7. python作品代码_学习python的一些心得体会
  8. STM8S——Analog/digital converter (ADC)
  9. Windows11安装JDK
  10. mina框架CumulativeProtocolDecoder.doDecode方法浅析
  11. php代码实现微信代扣,html5+如何通过native.js实现APP微信支付代扣签约?
  12. 第512章 河系量子计算机,分身投胎万界(猛虎道长著)_第512章、河系量子计算机_历史军事小说_笔趣阁...
  13. 电场强度 高斯定理 习题
  14. 我被感动了!世间自有真爱 - 林林与静静
  15. matlab2015 colormap,matlab中colormap函数
  16. 罗德里格旋转公式推导(自制)
  17. keycloak 验证 token
  18. 图像处理之Matlab图像读取
  19. Android指南针应用
  20. jacky自问自答-java并发编程

热门文章

  1. HMM——前向算法与后向算法
  2. 隐马尔科夫模型——简介
  3. Caffe + Ubuntu 15.04/16.04 + CUDA 7.5/8.0 在服务器上安装配置及卸载重新安装(已测试可执行)
  4. 1.Consul 简介和环境搭建
  5. 《剑指offer》第四十三题(从1到n整数中1出现的次数)
  6. react-webpack config webpack@3.4.1
  7. zabbix 从入门到精通
  8. angular中封装fancyBox(图片预览)
  9. 数据对拍代码 c++
  10. 基于RBGD的mapping