iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JDK和CGLib动态代理怎么实现
  • 307
分享到

JDK和CGLib动态代理怎么实现

2023-06-02 16:06:49 307人浏览 八月长安
摘要

本篇内容介绍了“jdk和CGLib动态代理怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:动态代理是一种常用的设计模式,广泛应用

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

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

什么是代理模式

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

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

JDK和CGLib动态代理怎么实现

代理模式的优点:

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

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

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

静态代理

什么是静态代理

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

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

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

  1. public interface SellMobilePhone {

  2. void sellMobilePhone();

  3. }

  4. public class MiPhoneFactory implements SellMobilePhone{

  5. public void sellMobilePhone() {

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

  7. }

  8. }

  9. public class MiPhoneAgent implements SellMobilePhone {

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

  11. private SellMobilePhone factory;

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

  13. public MiPhoneAgent(SellMobilePhone factory){

  14. this.factory = factory;

  15. }

  16. public void sellMobilePhone() {

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

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

  19. factory.sellMobilePhone();

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

  21. }

  22. }

  23. public class TestStaticProxy {

  24. @Test

  25. public void testProxy(){

  26. //创建被代理者

  27. SellMobilePhone factory = new MiPhoneFactory();

  28. factory.sellMobilePhone();

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

  30. //创建代理者

  31. SellMobilePhone agent = new MiPhoneAgent(factory);

  32. //调用卖手机

  33. agent.sellMobilePhone();

  34. }

  35. }

静态代理的问题:

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

动态代理

动态代理的特点:

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

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

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

区别是:

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

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

JDK动态代理

实现步骤:

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

2)实现invoke方法

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

  1. public class SalesAgent implements InvocationHandler{

  2. //被代理者对象

  3. private Object object;

  4. public Object createProxy(Object object){

  5. this.object = object;

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

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

  8. }

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

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

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

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

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

  14. return result;

  15. }

  16. }

  17. public class TestInvocationHandler {

  18. @Test

  19. public void testInvocation(){

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

  21. SalesAgent agent = new SalesAgent();

  22. //被代理对象

  23. SellMobilePhone sellMobilePhone = new MiPhoneFactory();

  24. //创建代理对象

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

  26. phoneProxy.sellMobilePhone();

  27. }

  28. }

CGLib动态代理

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

  1. public class CGLibProxy implements MethodInterceptor {

  2. public Object createProxy(Object object){

  3. //创建加强器

  4. Enhancer eh = new Enhancer();

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

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

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

  8. eh.setCallback(this);

  9. return eh.create();

  10. }

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

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

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

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

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

  16. return res;

  17. }

  18. }

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

--结束END--

本文标题: JDK和CGLib动态代理怎么实现

本文链接: https://www.lsjlt.com/news/230686.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JDK和CGLib动态代理怎么实现
    本篇内容介绍了“JDK和CGLib动态代理怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:动态代理是一种常用的设计模式,广泛应用...
    99+
    2023-06-02
  • jdk动态代理和cglib动态代理详解
    目录静态代理基于继承的方式实现静态代理基于聚合的方式实现静态代理继承与聚合方式实现的静态代理对比动态代理JDK动态代理如何实现一个HashMap的动态代理类?Cglib动态代理JDK...
    99+
    2022-11-12
  • JDK动态代理和CGLIB区别
    JDK动态代理和CGLIB区别1、JDK动态代理:利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。(相关视频教程分享:java视频...
    99+
    2020-11-10
    java教程 JDK CGLIB 区别
  • spring cglib 与 jdk 动态代理
    1. 概述JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处...
    99+
    2023-05-31
    spring cglib jdk
  • 基于jdk动态代理和cglib动态代理实现及区别说明
    目录jdk动态代理和cglib动态代理实现及区别jdk动态代理实现cglib动态代理区别总结jdk动态代理和cglib动态代理实现及区别 代理模式是一种设计模式,提供了对目标对象额外...
    99+
    2023-05-19
    jdk动态代理 cglib动态代理 jdk和cglib动态代理区别
  • 通俗易懂 快速理解 JDK动态代理 和 cglib动态代理
    动态代理的实现方案有两种,JDK动态代理和CGLIB动态代理,区别在于JDK自带的动态代理,必须要有接口,而CGLIB动态代理有没有接口都可以。 JDK动态代理:JDK原生的实现方式,需要被代理的...
    99+
    2023-10-21
    java spring
  • java动态代理(jdk与cglib)详细解析
    JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息...
    99+
    2022-11-15
    java jdk cglib
  • Java反射(JDK)与动态代理(CGLIB)详解
    目录一、反射二、动态代理1、JDK代理2、CGLIB代理3、JDK代理与CGLIB代理对比总结一、反射 概念:在运行状态中,对于任意的一个类,都能够知道这个类的所有字段和方法,对任意...
    99+
    2022-11-12
  • 怎么在java中实现CGLIB动态代理
    怎么在java中实现CGLIB动态代理?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言的代表,...
    99+
    2023-06-14
  • 深入理解java动态代理的两种实现方式(JDK/Cglib)
    什么是代理模式?代理模式:在调用处不直接调用目标类进行操作,而是调用代理类,然后通过代理类来调用目标类进行操作。在代理类调用目标类的前后可以添加一些预处理和后处理操作来完成一些不属于目标类的功能。为什么要使用代理模式?通过代理模式可以实现对...
    99+
    2023-05-31
    cglib jdk java
  • Spring中JDK和cglib动态代理原理的示例分析
    这篇文章给大家分享的是有关Spring中JDK和cglib动态代理原理的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java代理介绍Java中代理的实现一般分为三种:JDK静态代理、JDK动态代理以及C...
    99+
    2023-06-02
  • Java JDK与cglib动态代理有哪些区别
    本篇内容主要讲解“Java JDK与cglib动态代理有哪些区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java JDK与cglib动态代理有哪些区别”吧!一、说明sp...
    99+
    2023-07-05
  • 深入浅析java 中的JDK与cglib动态代理
    这篇文章将为大家详细讲解有关深入浅析java 中的JDK与cglib动态代理,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。java 动态代理实例详解1.jdk动态代理 package com...
    99+
    2023-05-31
    java jdk cglib
  • Spring之AOP两种代理机制对比分析(JDK和CGLib动态代理)
    目录Spring AOP两种代理机制对比JDK动态代理CGLib动态代理SpringAOP两种代理原理SpringAOP代理JDK动态代理CGLIB代理两者对比使用注意总结Sprin...
    99+
    2023-05-19
    Spring AOP AOP代理机制 JDK动态代理 CGLib动态代理
  • 怎么在Java中动态代理Cglib
    这篇文章将为大家详细讲解有关怎么在Java中动态代理Cglib,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种...
    99+
    2023-06-14
  • 静态代理、jdk、cglib动态代理 搞不清? 看这个文章就懂了
    一、代理模式 代理模式是一种比较好的理解的设计模式。简单来说就是 : 我们使用代理对象来增强目标对象(target obiect),这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。将核心业务代码和非核心的公共代...
    99+
    2023-08-30
    java jdk 代理模式 面试
  • 纯手写实现JDK动态代理
    作者:张丰哲原文:https://www.jianshu.com/p/58759fef38b8前言在Java领域,动态代理应用非常广泛,特别是流行的Spring/MyBatis等框架。JDK本身是有实现动态代理技术的,不过要求被代理的类必须...
    99+
    2023-06-02
  • Java如何实现JDK动态代理
    这篇文章主要讲解了“Java如何实现JDK动态代理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java如何实现JDK动态代理”吧!概念代理:为控制A对象,而创建出新B对象,由B对象代替执行...
    99+
    2023-07-02
  • JDK动态代理,代理接口没有实现类,实现动态代理方式
    目录JDK动态代理,代理接口没有实现类,实现动态代理被代理的接口:代理对象:那么接下来测试一下:jdk动态代理为什么要接口先通过一个简单例子实现功能:编写测试方法:里面的getPro...
    99+
    2022-11-12
  • 解析动态代理jdk的Proxy与spring的CGlib(包括区别介绍)
    目录1. 为什么要使用动态代理?2.JDK Proxy 动态代理面向接口的动态代理3.CGlib动态代理原理区别:两个动态代理的区别1. 为什么要使用动态代理? 动态代理:在不改变原...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作