千家信息网

JDK和CGLib动态代理怎么实现

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本篇内容介绍了"JDK和CGLib动态代理怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言
千家信息网最后更新 2025年01月19日JDK和CGLib动态代理怎么实现

本篇内容介绍了"JDK和CGLib动态代理怎么实现"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言:动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理。

什么是代理模式

代理模式是GOF23设计模式之一,代理模式中存在代理者和被代理者,代理者和被代理者都具有相同的功能,并且代理者执行功能时会附加一些额外的操作

如:手机工厂和代理商都具有卖东西的功能,手机代理商除了帮工厂卖手机外,还能在卖手机前打广告推销,卖手机后还可以进行售后服务。


代理模式的优点:

1)符合开闭原则,不用修改被代理者任何的代码,就能扩展新的功能

2)项目的扩展和维护比较方便

代理模式分为:静态代理和动态代理

静态代理

什么是静态代理

1)代理者和被代理者都实现了相同的接口(或继承相同的父类)

2)代理者包含了一个被代理者的对象

3)调用功能时,代理者会调用被代理者的功能,同时附加新的操作

  1. /**

  2. * 卖手机

  3. */

  4. public interface SellMobilePhone {

  5. void sellMobilePhone();

  6. }

  7. /**

  8. * 小米手机工厂

  9. */

  10. public class MiPhoneFactory implements SellMobilePhone{

  11. public void sellMobilePhone() {

  12. System.out.println("生产了小米9手机,卖出去!!");

  13. }

  14. }

  15. /**

  16. * 小米代理商

  17. */

  18. public class MiPhoneAgent implements SellMobilePhone {

  19. //被代理者,工厂对象

  20. private SellMobilePhone factory;

  21. //通过构造方法传入被代理者

  22. public MiPhoneAgent(SellMobilePhone factory){

  23. this.factory = factory;

  24. }

  25. public void sellMobilePhone() {

  26. System.out.println("打广告,做活动~~~~~~~~~~~~~~~~~");

  27. //调用被代理者的方法

  28. factory.sellMobilePhone();

  29. System.out.println("做售后,做推销~~~~~~~~~~~~~~~~~");

  30. }

  31. }

  32. public class TestStaticProxy {

  33. @Test

  34. public void testProxy(){

  35. //创建被代理者

  36. SellMobilePhone factory = new MiPhoneFactory();

  37. factory.sellMobilePhone();

  38. System.out.println("---------------------------------------");

  39. //创建代理者

  40. SellMobilePhone agent = new MiPhoneAgent(factory);

  41. //调用卖手机

  42. agent.sellMobilePhone();

  43. }

  44. }

静态代理的问题:

静态代理只能适合一种业务,如果有新的业务,就必须创建新的接口和新的代理,如添加卖电脑的接口和电脑工厂,就要创建新的电脑代理类。

动态代理

动态代理的特点:

1) 在不修改原有类的基础上,为原来类添加新的功能

2) 不需要依赖某个具体业务

动态代理分为:JDK动态代理和CGLib动态代理

区别是:

JDK动态代理的被代理者必须实现任意接口

CGLib动态代理不用实现接口,是通过继承实现的

JDK动态代理

实现步骤:

1)代理类需要实现InvocationHandler接口

2)实现invoke方法

3)通过Proxy类的newProxyInstance方法来创建代理对象

  1. /**

  2. * 动态代理

  3. */

  4. public class SalesAgent implements InvocationHandler{

  5. //被代理者对象

  6. private Object object;

  7. /**

  8. * 创建代理对象

  9. * @param object 被代理者

  10. * @return 代理者

  11. */

  12. public Object createProxy(Object object){

  13. this.object = object;

  14. //Proxy.newProxyInstance创建动态代理的对象,传入被代理对象的类加载器,接口,InvocationHandler对象

  15. return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);

  16. }

  17. /**

  18. * 调用被代理者方法,同时添加新功能

  19. */

  20. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

  21. System.out.println("销售之前,打广告~~~~~~");

  22. //调用被代理者的方法

  23. Object result = method.invoke(object,args);

  24. System.out.println("销售之后,做售后~~~~~~");

  25. return result;

  26. }

  27. }

  28. public class TestInvocationHandler {

  29. @Test

  30. public void testInvocation(){

  31. //创建动态代理对象

  32. SalesAgent agent = new SalesAgent();

  33. //被代理对象

  34. SellMobilePhone sellMobilePhone = new MiPhoneFactory();

  35. //创建代理对象

  36. SellMobilePhone phoneProxy = (SellMobilePhone) agent.createProxy(sellMobilePhone);

  37. phoneProxy.sellMobilePhone();

  38. }

  39. }

CGLib动态代理

特点:通过继承实现,被代理者必须能被继承,通过被代理类创建子类,子类就是父类的代理。

  1. /**

  2. * CGLib动态代理

  3. *

  4. */

  5. public class CGLibProxy implements MethodInterceptor {

  6. /**

  7. * 返回代理对象

  8. * @param object 被代理对象

  9. * @return 代理对象

  10. */

  11. public Object createProxy(Object object){

  12. //创建加强器

  13. Enhancer eh = new Enhancer();

  14. //设置被代理对象的类为父类

  15. eh.setSuperclass(object.getClass());

  16. //设置代理对象的回调

  17. eh.setCallback(this);

  18. return eh.create();

  19. }

  20. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

  21. System.out.println("售前~~~~~~CGLIB");

  22. //调用父类对象的方法

  23. Object res = proxy.invokeSuper(obj, args);

  24. System.out.println("售后~~~~~~CGLIB");

  25. return res;

  26. }

  27. }

"JDK和CGLib动态代理怎么实现"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

代理 动态 对象 手机 功能 接口 方法 模式 静态 工厂 相同 业务 小米 广告 电脑 不用 代理商 内容 同时 子类 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 新华三杯网络技术大赛成绩 电脑服务器CPU总核数 网络安全专业项目经验范文 江西赣才网络技术有限公司 徐汇区推广软件开发厂家口碑推荐 简述有哪几种软件开发方法 服务器过载哪些原因 无线网dns服务器手动设置 mes软件开发怎么样 旅游软件开发热线 国际服吃鸡总是连不上战斗服务器 北京拼多多互联网科技有限公司 软件开发英文俗称 软件开发技术基础代码例子 网络安全进社区金地社区 数据库推送部分数据 集安软件开发项目管理在线咨询 分布式数据库是否为主流 沁阳软件开发公司 涉密网络安全保密管理特点 金融机构网络安全案例分析 金仓数据库语法兼容 服务器运维服务常见故障 诚创数据库密码 2021杭州网络安全大赛 倩女幽魂手游怎么增加服务器 软件开发企业财务核算麻烦吗 即时通讯软件开发优势 服务器和带宽费用 怎么清理旧笔记本里有数据库
0