动态代理的两种实现方式
1、动态代理介绍
动态代理:在不改变目标对象方法的情况下对方法进行增强
组成:
- 被代理对象:真实的对象
- 代理对象:内存中的对象
要求:代理对象必须和被代理对象实现相同的接口
代理的实现方式有两种:(1)jdk动态代理;(2)CGLIB动态代理(这个是第三方实现的,所以使用这种方式,我们要引入jar包)
2、代码准备
StudentInterface接口代码
public interface StudentInterface {void eat(String name);void study();
}
Student代码
public class Student implements StudentInterface{public void eat(String name) {System.out.println("学生吃" + name);}public void study() {System.out.println("在家自学");}
}
Test代码
public class Test {public static void main(String[] args) {Student stu = new Student();stu.eat("米饭");stu.study();}
}
3、要求
要求:在不改动Student类中任何的代码的前提下,通过study方法输出一句话:来大学学习。
4、方法一:使用jdk动态代理
public class Test {public static void main(String[] args) {Student stu = new Student();/*stu.eat("米饭");stu.study();*//*类加载器:和被代理对象使用相同的类加载器接口类型Class数组:和被代理对象使用相同接口代理规则:完成代理增强的功能*/StudentInterface proxyStu = (StudentInterface) Proxy.newProxyInstance(stu.getClass().getClassLoader(), new Class[]{StudentInterface.class}, new InvocationHandler() {/*执行Student类中所有的方法都会经过invoke方法对method方法进行判断如果是study,则对其增强如果不是,还调用学生对象原有的功能即可*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("study")) {System.out.println("来大学学习");return null;}else {return method.invoke(stu,args);}}});proxyStu.eat("米饭");proxyStu.study();}
}
5、方式二:使用CGLIB动态代理
CGLIB jar的maven坐标
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>2.1_2</version> </dependency>
public class Test {public static void main(String[] args) {Student stu = new Student();/*stu.eat("米饭");stu.study();*/Object proxyStu = Enhancer.create(stu.getClass(), new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {if (method.getName().equals("study")) {System.out.println("来大学学习");return null;} else {return method.invoke(stu, args);}}}proxyStu.eat("米饭");proxyStu.study();}}
与jdk动态代理相比,CGLIB不要求必须要实现接口StudentInterface ,就能直接对目标对象就行代理增强,更加的简单方便。
动态代理的两种实现方式相关推荐
- SpringAop动态代理的两种实现方式
Spring的面向切面编程也是基于动态代理来实现的 静态代理:也就是自己手动创建的代理对象 动态代理:也就是在程序运行中通过配置参生的 那么Spring的AOP也就是面向切面编程,就是基于动态代理来实 ...
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别
视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...
- Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理
Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...
- Java动态代理的两种实现方法
转载自 http://blog.csdn.net/HEYUTAO007/article/details/49738887 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上 ...
- 动态代理的两种方式_动态代理是基于什么原理?
代理模式 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问. 什么是动态代理 运行时动态生成代理类. 动态代理我们需要些什么 1.业务接口(Interface) 业务的抽象表示. 2.业务 ...
- C语言动态数组的两种定义方式
动态内存分配具有非常多的好处,可以最大化的节约内存空间的大小.本文将通过两种方式来实现C语言中内存的动态分配,希望你看完本文后能有所收获. 一.直接对数组大小进行输入 在C99标准中C语言数组已支 ...
- Java实现动态代理的两种方式
http://m.blog.csdn.net/article/details?id=49738887
- Nginx反向代理的两种配置方式
一.nginx反向代理简单配置 1.准备nginx环境 这篇文章的前提是已经配置好了NGINX,而且tomcat已经配置好了,而且能能够访问了. 反向代理不同端口(本案例均是单节点) 这里介绍一台ng ...
最新文章
- Mapbox HTML可视化点,线,多线,面带底图
- Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
- 《数字视频和高清:算法和接口》一第2章 图像的采样和显示
- 《CCNP安全防火墙642-618认证考试指南》——1.4节防火墙技术
- 微信小程序将页面按钮悬浮固定在底部
- 作者:赵江华(1989-),女,中国科学院计算机网络信息中心研究实习员
- js的一些兼容性写法
- 【干货】--手把手教你完成文本情感分类
- python自动下载酷狗音乐_python获取酷狗音乐top500的下载地址 MP3格式
- HBase:HBase的rowKey设计技巧
- 查找Excel最后一个非空单元格的值,你会吗?(适用于数据加行时,一直引用最后一个非空单元格的值)
- java.io的缓冲流、转换流、序列化流
- LeetCode不浪费原料的汉堡制作方案
- 也许通过社群找工作,是未来的趋势。
- UEFI模式创建Grub2引导ubuntu16.04和windows10,并安装Linux Nvidia驱动
- oracle bround,【案例】Oracle警告 WARNING:inbound connection timed out (ORA-3136)解决办法
- 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
- 网站关键词排名:关键词排名提升的5个方法!
- 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果
- c# 中文数字转阿拉伯数字
热门文章
- 《静儿的服务治理私房菜》网络模型的分类和职业规划思考
- ESP32 学习笔记(六)I2C - Inter-Integrated Circuit
- 【论文翻译】Scene Text Detection and Recognition: The Deep Learning Era 场景文本检测和识别:深度学习时代
- 学科研究前沿--闲杂记录
- HTML版图像精灵制作工具
- 用命令清理计算机,快速清理电脑垃圾用什么命令
- 天天看盘网站突发君异动君实时监控提醒
- 从未在一起更让人遗憾_“从未在一起和最终没有在一起哪个更遗憾”
- ios 截取手机流量_年终大课:iOS新生态下该如何高效获取流量
- SpaceX将于两年内送人上太空;AI研发超级抗生素,能杀死多种抗药细菌|科技前沿周报...