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 ,就能直接对目标对象就行代理增强,更加的简单方便。

动态代理的两种实现方式相关推荐

  1. SpringAop动态代理的两种实现方式

    Spring的面向切面编程也是基于动态代理来实现的 静态代理:也就是自己手动创建的代理对象 动态代理:也就是在程序运行中通过配置参生的 那么Spring的AOP也就是面向切面编程,就是基于动态代理来实 ...

  2. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  3. Java中动态代理的两种方式JDK动态代理和cglib动态代理以及区别

    视频功能审核通过了,可以看视频啦!记得点关注啊~ 注意:因为网络原因,视频前一两分钟可能会比较模糊,过一会儿就好了 记得点关注啊,视频里的wx二维码失效了,wx搜索:"聊5毛钱的java&q ...

  4. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  5. Java动态代理的两种实现方法

    转载自 http://blog.csdn.net/HEYUTAO007/article/details/49738887 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上 ...

  6. 动态代理的两种方式_动态代理是基于什么原理?

    代理模式 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问. 什么是动态代理 运行时动态生成代理类. 动态代理我们需要些什么 1.业务接口(Interface) 业务的抽象表示. 2.业务 ...

  7. C语言动态数组的两种定义方式

      动态内存分配具有非常多的好处,可以最大化的节约内存空间的大小.本文将通过两种方式来实现C语言中内存的动态分配,希望你看完本文后能有所收获. 一.直接对数组大小进行输入 在C99标准中C语言数组已支 ...

  8. Java实现动态代理的两种方式

    http://m.blog.csdn.net/article/details?id=49738887

  9. Nginx反向代理的两种配置方式

    一.nginx反向代理简单配置 1.准备nginx环境 这篇文章的前提是已经配置好了NGINX,而且tomcat已经配置好了,而且能能够访问了. 反向代理不同端口(本案例均是单节点) 这里介绍一台ng ...

最新文章

  1. Mapbox HTML可视化点,线,多线,面带底图
  2. Python Qt GUI设计:窗口之间数据传递(拓展篇—5)
  3. 《数字视频和高清:算法和接口》一第2章 图像的采样和显示
  4. 《CCNP安全防火墙642-618认证考试指南》——1.4节防火墙技术
  5. 微信小程序将页面按钮悬浮固定在底部
  6. 作者:赵江华(1989-),女,中国科学院计算机网络信息中心研究实习员
  7. js的一些兼容性写法
  8. 【干货】--手把手教你完成文本情感分类
  9. python自动下载酷狗音乐_python获取酷狗音乐top500的下载地址 MP3格式
  10. HBase:HBase的rowKey设计技巧
  11. 查找Excel最后一个非空单元格的值,你会吗?(适用于数据加行时,一直引用最后一个非空单元格的值)
  12. java.io的缓冲流、转换流、序列化流
  13. LeetCode不浪费原料的汉堡制作方案
  14. 也许通过社群找工作,是未来的趋势。
  15. UEFI模式创建Grub2引导ubuntu16.04和windows10,并安装Linux Nvidia驱动
  16. oracle bround,【案例】Oracle警告 WARNING:inbound connection timed out (ORA-3136)解决办法
  17. 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
  18. 网站关键词排名:关键词排名提升的5个方法!
  19. 嵌入式学习——使用定时器输出PWM波形,实现 LED呼吸灯的效果
  20. c# 中文数字转阿拉伯数字

热门文章

  1. 《静儿的服务治理私房菜》网络模型的分类和职业规划思考
  2. ESP32 学习笔记(六)I2C - Inter-Integrated Circuit
  3. 【论文翻译】Scene Text Detection and Recognition: The Deep Learning Era 场景文本检测和识别:深度学习时代
  4. 学科研究前沿--闲杂记录
  5. HTML版图像精灵制作工具
  6. 用命令清理计算机,快速清理电脑垃圾用什么命令
  7. 天天看盘网站突发君异动君实时监控提醒
  8. 从未在一起更让人遗憾_“从未在一起和最终没有在一起哪个更遗憾”
  9. ios 截取手机流量_年终大课:iOS新生态下该如何高效获取流量
  10. SpaceX将于两年内送人上太空;AI研发超级抗生素,能杀死多种抗药细菌|科技前沿周报...