JDK与CGlib动态代理的实现
应用的原型为
执行者:房屋中介Agency(分为JDKAgency、CGlibAgency)
被代理对象:程序员Programmer
被代理对象的实现接口:租户Tenement(CGlibAgency时不需要实现接口)
Tenement 接口:
package com.suzao.spring.test; /**
* Tenement
* @Description 租户
* @Param
* @return
* @Author mc
* @Date 2018/12/28 16:44
*/
public interface Tenement { /**
* rentHouse
* @Description 租房方法
* @Param []
* @return
* @Author mc
* @Date 2018/12/28 18:51
*/
void rentHouse();
}
Programmer 实现类
package com.suzao.spring.test; /**
* Programmer
* @Description 程序员
* @Param
* @return
* @Author mc
* @Date 2018/12/28 18:21
*/
public class Programmer implements Tenement { /**
* rentHouse
* @Description 租房方法
* @Param []
* @return
* @Author mc
* @Date 2018/12/28 18:52
*/
@Override
public void rentHouse() {
System.out.println("我是程序员,我在找房子!");
}
}
JDK动态代理:执行者 JDKAgency
package com.suzao.spring.test; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* JDKAgency
* @Description JDK房屋中介
* @Param
* @return
* @Author mc
* @Date 2018/12/28 18:22
*/
public class JDKAgency implements InvocationHandler{ //拿到被代理对象的引用
private Tenement target; public Object getTenementProxy(Tenement target){
this.target = target;
Class clazz = target.getClass();
//clazz.getInterfaces() 获取它的接口
//重新动态生成一个class字节码
//编译
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("JDK房屋中介开始执行。。。");
System.out.println("----------------------------");
method.invoke(this.target,args);
System.out.println("----------------------------");
System.out.println("JDK房屋中介结束执行。。。");
return null;
}
}
CGlib动态代理:执行者 CGlibAgency
package com.suzao.spring.test; import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /**
* CGlibAgency
* @Description CGlib 租房中介
* @Param
* @return
* @Author mc
* @Date 2018/12/28 19:11
*/
public class CGlibAgency implements MethodInterceptor{ public Object getTenmentProxy(Class clazz){ Enhancer enhancer = new Enhancer(); //告诉cglib,生成的子类需要继承那个类
enhancer.setSuperclass(clazz); //设置回调
enhancer.setCallback(this); //加载到jvm中,并返回代理对象
return enhancer.create();
} @Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("CGlib房屋中介开始执行。。。");
System.out.println("----------------------------");
methodProxy.invokeSuper(obj,args);
System.out.println("----------------------------");
System.out.println("CGlib房屋中介结束执行。。。");
return null;
}
}
代理测试类 TestProxy
package com.suzao.spring.test; /**
* TestProxy
* @Description 测试代理
* @Param
* @return
* @Author mc
* @Date 2018/12/28 18:46
*/
public class TestProxy { public static void main(String[] args) { //java动态代理是利用反射机制生成一个实现被代理对象的接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 //执行者 JDKAgency
//被代理对象 Programmer
//被代理对象实现的接口 Tenement
Tenement tenement= (Tenement) new JDKAgency().getTenementProxy(new Programmer());
tenement.rentHouse();
System.out.println("\n\n"); //cglib动态代理利用asm开源包,对被代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。
//执行者 CGlibAgency
//被代理对象 Programmer
Programmer programmer= (Programmer) new CGlibAgency().getTenmentProxy(new Programmer().getClass());
programmer.rentHouse();
}
}
执行结果:
JDK房屋中介开始执行。。。
----------------------------
我是程序员,我在找房子!
----------------------------
JDK房屋中介结束执行。。。 CGlib房屋中介开始执行。。。
----------------------------
我是程序员,我在找房子!
----------------------------
CGlib房屋中介结束执行。。。
pom.xml中引用:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
JDK与CGlib动态代理的实现的更多相关文章
- 动态代理的两种方式,以及区别(静态代理、JDK与CGLIB动态代理、AOP+IoC)
Spring学习总结(二)——静态代理.JDK与CGLIB动态代理.AOP+IoC 目录 一.为什么需要代理模式 二.静态代理 三.动态代理,使用JDK内置的Proxy实现 四.动态代理,使用cg ...
- Spring AOP中的JDK和CGLib动态代理哪个效率更高?
一.背景 今天有小伙伴面试的时候被问到:Spring AOP中JDK 和 CGLib动态代理哪个效率更高? 二.基本概念 首先,我们知道Spring AOP的底层实现有两种方式:一种是JDK动态代理, ...
- 【java高级编程】JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言 JDK动态代理实现原理(jdk8):https://blog.csdn.net ...
- JDK、CGlib动态代理详解
Java动态代理之JDK实现和CGlib实现(简单易懂) 一 JDK和CGLIB动态代理原理 1.JDK动态代理 利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生 ...
- JDK和CGLIB动态代理区别
背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结. 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/de ...
- JDK和CGLIB动态代理原理
1.JDK动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler来处理. 2.CGLiB动态代 ...
- JDK和CGLIB动态代理原理区别
JDK和CGLIB动态代理原理区别 https://blog.csdn.net/yhl_jxy/article/details/80635012 2018年06月09日 18:34:17 阅读数:65 ...
- Spring框架中的JDK与CGLib动态代理
JDK和CGLib动态代理区别 JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类, 在调用具体方法前调用InvokeHandler ...
- spring框架中JDK和CGLIB动态代理区别
转载:https://blog.csdn.net/yhl_jxy/article/details/80635012 前言JDK动态代理实现原理(jdk8):https://blog.csdn.net/ ...
- jdk和cglib动态代理
一.原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理. 而cglib动态代理是利用asm开源包,对代理对象类的class文件加 ...
随机推荐
- 客户想要的 vs 客户实际预算:漫画解读软件开发模式
转自:http://blog.jobbole.com/113230/ 1913 年,美利坚工业之神——亨利福特,发明了世界上第一条流水线,汽车工业从此进入了大规模生产的时代.丰田公司提出的丰田生产系统 ...
- Linux下创建NFS来实现共享文件
简介说明: 在项目生产环境我们经常需要实现文件共享,传统的常见方案是通过NFS,实现服务器之间共享某一块磁盘,通过网络传输将分散的文件集中存储在一块指定的共享磁盘,实现基本的文件共享.实现这种方案,分 ...
- 【Git】六、分支管理&冲突解决
上一节讲了如何和远端的仓库协同工作,这一节介绍一下分支 ---------------------------- 提要 //创建一个分支dev $ git branch dev //切换到dev分支 ...
- XY//电容
X,Y电容都是安规电容,火线零线间的是X电容,火线与地间的是Y电容.它们用在电源滤波器里,起到电源滤波作用,分别对共模,差模工扰起滤波作用.安规电容是指用于这样的场合,即电容器失效后,不会导致电击,不 ...
- Centos7 docker、harbor 安装配置
Docker 安装 wget -O /etc/yum.repos.d/epel.repo http://mirrors.cloud.tencent.com/repo/epel-7.repo wget ...
- linux-2.6.38 input子系统(用输入子系统实现按键操作)
一.设备驱动程序 在上一篇随笔中已经分析,linux输入子系统分为设备驱动层.核心层和事件层.要利用linux内核中自带的输入子系统实现一个某个设备的操作,我们一般只需要完成驱动层的程序即可,核心层和 ...
- C++-cin与scanf cout与printf效率问题
http://blog.csdn.net/l2580258/article/details/51319387 void cin_read_nosync() { freopen("data.t ...
- jsp的标签库
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是一个定制标签类库的集合,用于解决一些常见的问题,例如迭代一个映射或者集合.条件测试.XML ...
- 平衡树treap 0基础详解
刚开始学treap..同学在台上给我们讲,貌似除我之外的机房dalao们都听懂了就我发呆...(滑稽) 于是,事后的窝只能自己上网翻书研究了.... treap: treap=tree+heap,树+ ...
- CF700E Cool Slogans——SAM+线段树合并
RemoteJudge 又是一道用线段树合并来维护\(endpos\)的题,还有一道见我的博客CF666E 思路 先把\(SAM\)建出来 如果两个相邻的串\(s_i\)和\(s_{i+1}\)要满足 ...