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文件加 ...
随机推荐
- asp.net mvc4 学习1
1 简介:微软在很早就看到了基于windows系统的web开发平台的需求,这时便开始提出自己的解决方案即微软的第一个基于web开发的平台ASP.再后来随着需求和性能的要求再2002年推出第二个解决方案 ...
- printf颜色
格式 printf("\033[?m%s\033[0m", str); 多个属性以:分隔 属性: \033[0m:关闭所有属性 \033[1m:设置高亮度 \033[4m:下划线 ...
- MySQL时间类型及获取、展示处理
MySQL时间格式 mysql所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值 ...
- Spring Cloud(五)断路器监控(Hystrix Dashboard)
在上两篇文章中讲了,服务提供者 Eureka + 服务消费者 Feign,服务提供者 Eureka + 服务消费者(rest + Ribbon),本篇文章结合,上两篇文章中代码进行修改加入 断路器监控 ...
- 修正Calendar的Bug
procedure TAndroidNativeCalendarListener.onSelectedDayChange(view: JCalendarView; year, month, dayOf ...
- 工作总结 页面 ActionResult / JsonResult 将对象以 Json() 返回
其实都不用在页面上序列化 打印 都不需要在页面上 像这样 var ajaxResult = eval("(" + data + ")"); 序列化为对象 ...
- MongoDB——理论及使用命令详解 数据库
数据存储阶段 文件管理阶段(.txt .doc .xls) 优点: 1 使用简单,展现直观 2 可以长期保存数据 3 可存储数据量比较大 缺点: 1 查找不方便, 2 容易造成数据冗余, 3 格式不 ...
- 怎么解决Win7电脑更新出现80072EE2代码的错误?
我们在使用Win7系统时经常会遇到更新,这些更新可以修复一些系统漏洞,提高系统的安全性.但有时我们在进行相关更新时会出现错误,而导致最后的更新失败.下面好系统重装助手就和大家分享一下Win7系统更新出 ...
- Django—logging配置
我写Django项目常用的logging配置. # Django的日志配置项 BASE_LOG_DIR = os.path.join(BASE_DIR, "log") LOGGIN ...
- TCP 的三次握手和四次挥手,TCP 的流量控制和拥塞控制
70.TCP协议的三次握手与四次挥手70.1.TCP报文结构 1.源端口号:表示发送端端口号,字段长为16位. 2.目标端口号:表示接收端口号,字段长为16位. 3.序列号:表示发送数据的位置 ...