JDK动态代理 和CGLib动态代理实现原理和两者的区别

jdk动态代理和cglib动态代理对比 JDK 动态代理:只代理接口(interface),无法代理类。它使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现动态代理。 CGLIB 动态代理:可以代理类和接口。它通过生成目标类的子类来创建代理对象,因此可以代理没有实现接口的类。 阅读详情

JDK动态代理 和CGLib动态代理实现原理和两者的区别

JDK动态代理和CGLib动态代理都是Java中实现动态代理的方式,但是它们的实现原理和使用场景有所不同。

JDK动态代理是基于Java反射机制实现的。在运行时,JDK动态代理会动态地创建一个实现指定接口的代理类,并且重写该接口的所有方法,使得这些方法的调用都被转发到InvocationHandler对象中的invoke方法中进行处理。在使用JDK动态代理时,被代理的对象必须实现一个或多个接口,代理对象的类型由接口类型决定。

CGLib动态代理则是通过继承被代理类来实现的。在运行时,CGLib动态代理会动态地创建一个被代理类的子类,并且重写该类的所有非final方法,使得这些方法的调用都被转发到MethodInterceptor对象中的intercept方法中进行处理。在使用CGLib动态代理时,被代理的类不必实现任何接口,代理对象的类型由被代理类的类型决定。

两者的区别在于:

  1. JDK动态代理只能代理实现了接口的类,而CGLib动态代理可以代理任何类。
  2. JDK动态代理是通过接口来实现的,因此代理对象的方法调用效率较低;而CGLib动态代理是通过继承来实现的,因此代理对象的方法调用效率较高。
  3. JDK动态代理在运行时会动态生成代理类,因此会占用较少的内存空间;而CGLib动态代理在运行时会动态生成被代理类的子类,因此会占用较多的内存空间。
  4. JDK动态代理是Java官方提供的实现方式,使用较为广泛,而CGLib动态代理是第三方库提供的实现方式,使用较少。

总的来说,如果被代理的类实现了接口,建议使用JDK动态代理;如果被代理的类没有实现接口,建议使用CGLib动态代理。
以下是JDK动态代理和CGLib动态代理的实现示例:

JDK动态代理的实现:
定义一个接口 UserService:

typescript
Copy code
public interface UserService {
    void addUser(String username, String password);
    void deleteUser(String username);
}

定义一个实现了 UserService 接口的类 UserServiceImpl:

public class UserServiceImpl implements UserService {
    @Override
    public void addUser(String username, String password) {
        // 添加用户的具体实现
    }

    @Override
    public void deleteUser(String username) {
        // 删除用户的具体实现
    }
}

定义一个 InvocationHandler 类 UserInvocationHandler:

public class UserInvocationHandler implements InvocationHandler {
    private UserService userService;

    public UserInvocationHandler(UserService userService) {
        this.userService = userService;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("执行方法前的日志记录");
        Object result = method.invoke(userService, args);
        System.out.println("执行方法后的日志记录");
        return result;
    }
}

创建代理对象:

public static void main(String[] args) {
    UserService userService = new UserServiceImpl();
    UserInvocationHandler invocationHandler = new UserInvocationHandler(userService);
    UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(),
            new Class<?>[] { UserService.class },
            invocationHandler);
    proxy.addUser("Tom", "123456");
    proxy.deleteUser("Tom");
}

上述代码中,通过 Proxy.newProxyInstance() 方法创建一个代理对象,指定了要代理的接口类型、InvocationHandler 对象,最终返回一个实现了 UserService 接口的代理对象。当调用代理对象的方法时,实际上是调用了 InvocationHandler 中的 invoke() 方法,该方法中可对方法调用进行增强或拦截。

CGLib动态代理的实现:
定义一个类 User:

public class User {
    private String username;
    private String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public void addUser() {
        // 添加用户的具体实现
    }

    public void deleteUser() {
        // 删除用户的具体实现
    }
}

定义一个 MethodInterceptor 类 UserMethodInterceptor:

public class UserMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("执行方法前的日志记录");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("执行方法后的日志记录");
        return result;
    }
}

创建代理对象:

public static void main(String[] args) {
    Enhancer enhancer = new Enhancer();
	enhancer.setSuperclass(User.class);
	enhancer.setCallback(new UserMethodInterceptor());
	User proxy = (User) enhancer.create(new Class<?>[] 	 {String.class, String.class}, new Object[] {"Tom", "123456"});

}

上述代码中,通过 Enhancer.create() 方法创建一个代理对象,指定了要代理的类的类型、MethodInterceptor 对象,最终返回一个 User

【Spring Boot实战与进阶】AOP的两种动态代理(JDK和Cglib) 引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。 阅读详情

相关推荐

【JVM与性能调优】JVM动态代理、JDK动态代理和CGLib动态代理傻傻分不清楚

JDK动态代理和CGLib动态代理都是Java中用于创建动态代理的方法,但它们的实现方式不同。

奶爸的编程之路,也就一周冷个三天 1651

Spring原理学习(七)JDK动态代理与CGLIB代理底层实现

编译器也能修改 class 实现增强编译器增强能突破代理仅能通过方法重写增强的限制:可以对构造方法、静态方法等实现增强为什么有这么麻烦的一套东西呢?避免反射,提高性能,代价是一个代理类配两个 FastClass 类,代理类中还得增加仅调用 super 的一堆方法用编号处理方法对应关系比较省内存,另外,最初获得方法顺序是不确定,这个过程没法固定死与JDK动态代理相比,CGLIB代理类数目相对较少,只有两个类。而JDK动态代理在调用到第十七次后会生成代理类去优化为非反射调用,并且是一个方法对应一个代理类。

小鲁蛋的博客 1895

深入理解动态代理:JDK动态代理与CGLIB动态代理

动态代理是一种在运行时创建代理对象的技术,通过代理对象来控制对原对象的访问,能够在不修改原对象的情况下添加额外的功能。JDK动态代理:基于Java反射机制,只能代理实现了接口的类。CGLIB动态代理:基于字节码生成技术,可以代理没有实现接口的类。// 抽象主题接口动态代理在Java中提供了一种灵活而强大的机制,能够在运行时为目标对象添加额外的功能。JDK动态代理和CGLIB动态代理各有优势和适用场景,开发者可以根据具体需求选择合适的代理机制。希望这篇文章对你理解动态代理有所帮助。

捕风捉你 · 星桥API接入与大模型实战 3149

JDK和CGLIB动态代理的区别

学习动态代理的区别

qq_59527118的博客 2万+

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

芯片设计中的STA实战:如何避免时序违例(含常见问题解析)

本文深入探讨了芯片设计中静态时序分析(STA)的实战应用,重点解析了如何避免时序违例。文章从STA的核心逻辑与约束制定出发,强调了将时序意识植入RTL编码与综合阶段的重要性,并详细介绍了后端物理实现中的时序收敛策略。同时,针对跨时钟域路径误报、多工艺角违例等常见问题提供了深度解析与调试技巧,旨在帮助IC设计工程师系统性地掌握时序分析与优化方法。

open4的博客 507

JDK动态代理和CGLib动态代理实现原理和两者的区别

3.创建实现指定接口的代理类(转发到InvocationHandler对象中的invoke方法中)(invoke方法又会跳转到被代理类的目标方法中)* 3. InvocationHandler类中method.invoke(target, args)* 2. proxy类中InvocationHandler.invoke()2.被代理类决定类型(代理对象的类型)(不需要实现接口)jdk代理(实现接口的类),cglib代理(任何类)2.必须实现接口(代理对象)

weixin_51691183的博客 223

Agent Skills:AI智能体规模化落地的基础设施

摘要:AgentSkills体系已成为AI智能体落地的核心基础设施,解决了能力扩展和行业知识沉淀两大核心难题。该开放标准通过语义优先、渐进式披露等设计原则,实现了工具调用的标准化和可控化,同时支持轻量化知识沉淀。Skill作为最小能力单元,将传统软件功能、行业知识等封装为可被智能体调用的标准化模块,推动了软件产业从"工具时代"向"智能体时代"的范式变革。目前该体系已被主流Agent工具广泛兼容,形成完整生态,未来将持续演进,进一步降低落地门槛,推动AI原生转型。

技术引领业务创新 1147

3.JDK动态代理和CGLib动态代理实现原理和两者的区别

总的来说,如果被代理的类实现了接口,建议使用JDK动态代理;如果被代理的类没有实现接口,建议使用CGLib动态代理。

weixin_64235858的博客 192

Anylogic试用版密匙

#$%99dTMbLIj+hm/c9fn0suWlfQjdK9FzRH8oSbR Rbm3FEeONkF5mDLKHxhscEDBANDg4BSU2Oi6hErk TH/KzwiCtsM0jfD50uRsj60+gi9ifTlduwcpSr6a GtVSilXwF997xTVAoMLddqOzGQAbnSjBiJOBdm1Z 0QwwIEJynvYgckLfoEADzncIgNnJjYshWcmGh3s9 gTgyuQPlRBeTXfb+ZJPI1JGi4sAUljwdB53Df+AX SEf5FaIbih

qq_43939616的博客 8245

复现:Mamba-UNet:降水临近预报的创新解决方案

Mamba-UNet通过其创新的双分支Mamba融合模块、多尺度时空注意力模块和动态分位数加权损失函数,在降水临近预报领域取得了显著的性能提升。它不仅在多种降水场景下表现出色,尤其在预测强降水事件方面展现出了强大的能力。这一创新模型为降水临近预报提供了一种新的解决方案,有望在未来的研究和应用中发挥更大的作用,为应对气候变化带来的挑战提供有力支持。随着技术的不断发展和优化,我们期待Mamba-UNet在更广泛的气象预报任务中发挥更大的价值,为各行各业提供更精准、更可靠的降水预报服务。

hanfeng5268的博客 906

aop的实现原理,cglib和jdk动态代理的区别

aop的实现原理 Spring AOP有两种方式实现动态代理,如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP。如果目标对象没有实现了接口,必须用cglib实现aop cglib和jdk动态代理的区别 jdk动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 cglib的原理是对指定的目标类生成一个子类,并覆盖其中...

qq_35701633的博客 711

基于Python的上市公司年报PDF文本抓取与财务风险分析系统

随着大数据时代的到来,金融数据分析已成为投资决策和风险管理的重要工具。上市公司年报包含了丰富的财务信息和经营数据,通过对这些数据的提取和分析,可以评估公司的财务状况和潜在风险。本文将详细介绍如何使用Python构建一个完整的上市公司年报文本抓取与财务风险分析系统,涵盖PDF文本提取、数据清洗、财务指标计算和风险分析等全流程。

2201_76125261的博客 307

cglib动态代理实现原理_cglib动态代理和jdk动态代理的区别与应用

引入如果从一个Controller调用Service的非事务方法a,然后在a里调用事务方法b,b事务生效吗? public void update() { updateActual(); int a = 1 / 0; } @Transactional public void updateActual() { WithHoldInfoVO vo = new WithHoldInfoVO(); vo....

weixin_39771614的博客 62

MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能

该MATLAB代码实现了一个柱塞泵配流盘过流面积的计算和可视化功能。输出曲线可直接用于验证设计的合理性(如是否存在过流面积突变或不足)。的不同范围,选择对应的几何模型计算过流面积。通过分段逻辑计算柱塞腔在不同旋转角度(过流面积在特定条件下会被限制(如。),确保结果符合物理实际。条件分支,根据旋转角度。

huanghm88的专栏 575

手把手实现3D肺结节检测:基于Faster R-CNN的从CT处理、训练到部署的五步代码级实战与避坑指南

亲爱的同学,当你能完整实现“3D Faster R-CNN肺部结节检测系统”,你会发现医学影像AI的毕设课题充满挑战与成就感。我们围绕3D Faster R-CNN模型,从数据处理、模型搭建到实验验证,一步步带你打造一个能精准检测肺部结节的智能系统,让你的毕设既体现技术深度,又能为肺部疾病早期诊断贡献实用价值。是专为3D医学影像设计的目标检测模型,能在三维CT数据中自动定位、识别肺部结节——这一课题兼具“临床价值”和“技术挑战性”,是毕设的优质选择,能充分展现你的工程能力和科研敏感度。

LXY_LOVE36的博客 301

深入解析:Cglib与JDK动态代理的实现原理、区别及性能对比

摘要:本文对比分析了Java中两种动态代理技术——JDK动态代理和Cglib的实现原理与性能特点。JDK动态代理基于反射机制,仅支持接口代理,实现简单但性能较低;Cglib通过字节码生成子类实现代理,支持普通类代理且方法调用性能更高,但创建代理较慢。测试表明JDK代理创建更快而Cglib调用更优。选择建议:接口代理且低频调用选JDK,无接口类或高频调用选Cglib。两种代理各有优劣,需根据具体场景权衡选择。

LINgZone2的博客 377

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JDK、CGLIB 动态代理对比

文章内容已经收录在,从原理出发,直击面试难点,实现更高维度的降维打击!

qq_45260619的博客 1148

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

指定jdk_Java:聊聊JDK和CGLib动态代理实现和区别

前言上周五在电面试阿里时,被问到Spring AOP中JDK和CGLib动态代理的区别?于是搜集网上相关知识点,在此整理一下,供大家参考。JDK和CGLib动态代理实现动态代理在Java中有着广泛的应用,如Spring AOP,Hibernate数据查询、测试框架的后端mock、RPC,Java注解对象获取等。动态代理的代理关系是在运行时期确定的。接下来主要阐述两种动态代理的区别。JDK和CGLi...

weixin_30788829的博客 70

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

(转帖)Cglib和jdk动态代理的区别及运行性能比较

Cglib和jdk动态代理的区别及运行性能比较

cleble的专栏 8430

jdk动态代理和CGLIB动态代理的区别

一、原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。 而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3、如果目...

芒果哥的专栏 9357

Java | JDK和CGLIB动态代理区别

JDK动态代理原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785CGLIB动态代理实现原理:h...

sinat_27143551的博客 638

JDK动态代理和CGLib动态代理的区别

前言 Github:https://github.com/yihonglei/thinking-in-spring(spring工程) JDK动态代理实现原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理:https://blog.csdn.net/yhl_jxy/article/details/80633194 一 JDK和CGLIB动态代理原理 1、JDK动态代理 利用拦截器(拦截器必须实现Invoc

花开的博客 888

cglib动态代理与jdk动态代理的区别和各自实现

1、JDK动态代理具体实现原理: 通过实现InvocationHandlet接口创建自己的调用处理器; 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理; 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型; 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入; JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生产被代理接

All In. 398
上一篇: synchronized 升级过程
下一篇: Mysql
zeng2813
博客等级 码龄12年 123粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值