【面试】Java动态代理JDK Proxy 和 CGLib 有什么区别?嘿嘿嘿

面试官:解释下JDK动态代理为什么要基于接口? 我们知道,扩展一个类,要么继承,要么实现接口,这两种方式都可以对方法进行增强。JDK 动态代理使用的是类和接口。在动态代理机制中,Proxy类通过实现代理类的接口来生成代理对象,并将方法调用委托给。因此,JDK 动态代理的工作原理也决定了它只能代理接口,而不能直接代理具体类。那么可以有其他方式不代理接口吗,有,就是CGLIB动态代理! 阅读详情

文章目录


Java动态代理是Java提供的一种功能,允许开发者在运行时动态地创建实现特定接口的代理类。这种功能主要用于AOP(面向切面编程)场景,如日志记录、事务管理、权限验证等。

JDK Proxy

JDK Proxy是Java标准库提供的一种动态代理实现方式,它基于接口实现。JDK Proxy只能为接口创建代理实例,而不能为类创建代理实例。

理解讲解:

  1. 基于接口:JDK Proxy要求目标对象必须实现至少一个接口,因为代理类本身也是该接口的实现。
  2. 运行时生成:代理类是在运行时动态生成的,不是预编译的。
  3. InvocationHandler:通过实现InvocationHandler接口,我们可以定义当方法被调用时应该执行的操作。

代码实现:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface MyInterface {
    void doSomething();
}

class MyInterfaceImpl implements MyInterface {
    @Override
    public void doSomething() {
        System.out.println("Doing something...");
    }
}

class MyInvocationHandler implements InvocationHandler {
    private Object target;

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method call...");
        Object result = method.invoke(target, args);
        System.out.println("After method call...");
        return result;
    }

    public MyInterface getProxy() {
        return (MyInterface) Proxy.newProxyInstance(
                MyInterface.class.getClassLoader(),
                new Class<?>[]{MyInterface.class},
                this
        );
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterfaceImpl target = new MyInterfaceImpl();
        MyInvocationHandler handler = new MyInvocationHandler(target);
        MyInterface proxy = handler.getProxy();
        proxy.doSomething();
    }
}

CGLib

CGLib(Code Generation Library)是一个强大的、高性能的代码生成库,它可以在运行时扩展Java类和实现Java接口。与JDK Proxy不同,CGLib可以为目标类创建代理实例,而不仅仅是接口。

理解讲解:

  1. 基于类:CGLib不需要目标对象实现接口,它直接为目标类生成子类作为代理。
  2. 字节码操作:CGLib使用ASM库来操作字节码,生成代理类的字节码,并在运行时加载这些字节码。
  3. 方法拦截:CGLib使用MethodInterceptor接口来定义方法被调用时应该执行的操作。

注意:虽然CGLib的功能更强大,但由于它涉及字节码操作,因此可能比JDK Proxy更复杂,且性能上可能略逊一筹(但在大多数情况下,这种差异可以忽略不计)。

代码实现(这里只给出核心部分,因为CGLib的使用通常涉及更多的配置和设置):
下滑查看解决方法

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

// ... 省略了其他代码 ...

class MyMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method call...");
        Object result = proxy.invokeSuper(obj, args); // 使用invokeSuper而不是invoke,以避免无限递归
        System.out.println("After method call...");
        return result;
    }

    public MyTargetClass getProxy(MyTargetClass target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MyTargetClass.class);
        enhancer.setCallback(this);
        return (MyTargetClass) enhancer.create(); // 这里会返回MyTargetClass的子类实例作为代理
    }
}

在上面的代码中,MyTargetClass是你要代理的目标类,而MyMethodInterceptor是方法拦截器,它定义了当方法被调用时应该执行的操作。注意,由于CGLib是基于类的代理,因此它使用invokeSuper方法来调用目标类的方法,以避免无限递归。

java基础篇--动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别? 90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。 我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别? 典型回答 动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。 但动态代理不止有反射一种实现方式,例如,动态 阅读详情

相关推荐

webview腾讯x5内核离线安装

离线集成腾讯TBS浏览器服务,彻底解决官方下载限流问题,永久免费

观千剑而后识器,操千曲而后晓声。 7910

JDK Proxy 和 CGLib 有什么区别?

JDK Proxy 和 CGLib 有什么区别? 文章目录JDK Proxy 和 CGLib 有什么区别?前言1.主要区别2.JDK Proxy 动态代理3.CGLib 的实现4.Lombok5.总结6.参考 前言 JDK 动态代理的实现方式是反射。 反射机制 是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。 CGLib 实现动态代理是基于 ASM(一个 Java 字节码操作框架)而非反射实现的。 动态代理是一种行为方式

谢文峰的博客 4616

保姆级教程:在RK3588 Android12设备树(DTS)中配置MIPI 8 Lane双通道与DSC显示

本文详细介绍了在RK3588 Android12平台上配置MIPI 8 Lane双通道与DSC显示的实战指南。通过设备树(DTS)参数详解、DSC参数计算与PPS配置、双通道同步机制实现等内容,帮助开发者高效完成高分辨率屏幕驱动配置,解决嵌入式显示系统开发中的常见挑战。

weixin_30905133的博客 399

Java动态代理JDK和CGLIB的差别

JDK动态代理和CGLIB动态代理的差别

weixin_44705301的博客 1302

告别Selenium!纯Python+Requests搞定微信视频号登录Cookie(附完整代码与避坑指南)

本文详细介绍了如何利用纯Python和Requests库实现微信视频号的自动化登录,替代传统的Selenium方案。通过解析HTTP请求交互流程,提供完整的代码实现和避坑指南,显著提升爬虫效率和隐蔽性,适用于轻量化爬虫开发。

weixin_30642561的博客 312

告别二极管发热!手把手教你用MOS管搭建同步整流电路(附死区时间设置避坑指南)

本文详细介绍了如何利用MOS管搭建同步整流电路(SR),以替代传统二极管,显著降低导通损耗和发热问题。内容涵盖自驱动方案的选择、关键元件参数计算、PCB布局要点及死区时间设置技巧,帮助工程师优化电源设计效率。

weixin_29540599的博客 452

Spring AOP CGLib与JDKProxy的区别与示例

综上所述,JDK动态代理适用于代理接口实现类的场景,而CGLIB代理适用于代理没有实现接口的类的场景。如果你需要代理接口实现类,而且不想引入额外的依赖,那么JDK动态代理是一个不错的选择;如果你需要代理没有实现接口的类,那么CGLIB代理可能更适合你的需求。JDK动态代理和CGLIB代理都有它们自己的优缺点。

LoveSummer 4万+

期货套利策略(二)

接上一篇期货套利策略,随着对期货套利策略的深入了解,我发现套利策略不是那么好做的。下面将会讲碰到的一些问题。 上一篇文章中没有考虑滑点的问题,这里我们把滑点问题考虑进去。这里先说一些天勤api的买入点,天琴的买入点是当前K线的收盘价。碰到数据传输问题,还有计算等各方面问题,实际情况是无法在当前K线的收盘价买入的。这里我们把这方面问题考虑进去,利用api.wait_update()调到下一个k线数据...

qq_31611005的博客 1712

动态代理jdk的Proxy与Spring的CGlib

动态代理:在不改变原有代码的情况下上进行对象功能增强 使用代理对象代替原来的对象完成功能 进而达到拓展功能的目的。cglib动态代理模式是面向父类。

知不足而奋进 望远山而前行 669

CLCD 中国生命周期基础数据库使用攻略

CLCD 是公共建筑碳排放计算的理想选择,其本地化数据可显著提高计算准确性。

hy行者勇哥的博客 2685

华为OD机试真题 新系统2026-04-15 Java&Go 实现【小猫钓鱼纸牌游戏】

有两名玩家甲和乙,他们玩一种“小猫钓鱼”扑克牌游戏。扑克牌为A、2、3、....J、Q、K,不考虑花色都用1-13来表示,然后给甲,乙两人各发n张牌,按给定顺序排成队列,这些牌背面朝上,正面朝下放置,队列的第一个元素是背面的第一张牌。 游戏规则如下:

MISAYAONE的博客 352

【面试精讲】Java动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

本文深入探讨了Java动态代理的实现机制,分别介绍了使用JDK Proxy和CGLib两种不同方式来实现动态代理。

小明的Java问道之路 5137

# 【WorkBuddy专栏33】工作空间,最大的WorkBuddy技巧——任务隔离、记忆分区与多项目管理实战

工作空间,最大的WorkBuddy技巧——任务隔离、记忆分区与多项目管理实战

AI人人懂 2132

java面试题,什么是动态代理?、动态代理和静态代理有什么区别?说一下反射机制?JDK Proxy 和 CGLib 有什么区别?动态代理的底层

java面试题,什么是动态代理?、动态代理和静态代理有什么区别?说一下反射机制?JDK Proxy 和 CGLib 有什么区别?动态代理的底层

hutao8896的博客 1356

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Devexpress16.2.6破解工具

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

Java开发大厂面试第08讲:动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

今天我们分享 了 JDK Proxy 和 CGLib 的区别,JDK Proxy 是 Java 语言内置的动态代理,必须要通过实现接口的方式来代理相关的类,而 CGLib 是第三方提供的基于 ASM 的高效动态代理类,它通过实现被代理类的子类来实现动态代理的功能,因此被代理的类不能使用 final 修饰。除了 JDK Proxy 和 CGLib 之外,我们还讲了 Java 中常用的工具类 Lombok 的实现原理,它其实和反射是没有任何关系的;

2401_84585615的博客 1247

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【沉浸式求职学习day43】【Java面试题精选3】

Java面试题精选3

贺函不是涵的博客 1146

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【从0开始学习Java | 第23篇】动态代理

生活例子:你想找周杰伦签名 → 你不会直接找周杰伦 → 你找他的经纪人(代理)→ 经纪人帮你转达、加点要求(唱歌前先喝热水)、最后还是周杰伦签的名。Java里的代理就是这个道理。重阳,恭喜你!当你能完全手敲出上面的动态代理代码时,恭喜你已经超越了市面上 80% 的 Java 程序员!这就是为什么Spring能用几行注解就实现事务、缓存、权限控制的底层原理!下一节我们直接上CGLIB动态代理 + 手撕Spring AOP底层原理,准备好了吗?把上面代码完整敲一遍(必须!告诉我你跑通了吗?

likuoelie的博客 683

Java面试-Spring AOP 的实现原理:动态代理(JDK Proxy 与 CGLIB)

本文深入解析了Spring AOP的实现原理,重点对比了JDK动态代理和CGLIB动态代理两种实现方式。JDK动态代理基于接口实现,通过InvocationHandler拦截方法调用;CGLIB则通过继承目标类生成子类代理。文章详细分析了两种代理的优缺点:JDK代理性能较好但需接口支持,CGLIB可代理无接口类但性能略低。同时提供了手写实现代码示例,并总结了Spring选择代理方式的策略。最后还包含AOP执行流程、常见面试题和避坑指南,帮助开发者全面掌握Spring AOP的核心机制。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Java静态代理、动态代理(JDK代理、CGLIB代理)常见面试题

小结: 静态代理不灵活,静态代理类似模板方法设计模式。 动态代理灵活、方便。每个框架都会使用到,例如,spring中的AOP。默认为JDK实现方式,也可选择CGLIB实现方式。 JDK动态代理只能代理实现接口的类或者直接代理接口。限制:必须要有接口。思考:Spring中AOP是如何实现的?(改天会作为一个专题研究一下) CGLIB动态代理即可代理接口也可代理类。 JDK直接代理类会出现java.lang.IllegalArgumentException: xxx is not an interfa

qq_42390636的博客 2083

jdk动态代理实例和cglib动态代理实例_全面解析动态代理 JDK Proxy 及 CGLib 原理

@本文阅读大概需要6分钟1 什么是代理 代理的目标是为某一个对象提供一个代理,并由代理对象来控制对原对象的访问。依据代理类的创建时间,分为静态代理和动态代理。静态代理是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前已经确定好。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。在程序运行时,通过反射机制动态创建而成。简单地说,代理是用来在被代理对...

weixin_39882394的博客 224

JDK动态代理与Cglib动态代理(SpringBoot2.x使用spring aop示例)

我相信springaop中使用JDK动态代理与Cglib动态代理的区别这一问题在刚毕业的同学面试时都被问过。我们都会答:JDK动态代理的目标对象需要实现接口,Cglib动态代理的目标对象不需要实现接口。再牛逼一点的朋友可能会再答JDK动态代理通过反射来实现,Cglib动态代理通过对字节码的操作来实现的,动态代理可以用来做权限控制、事务、日志处理等作用。 再问下去我们就开始慌了因为我们知道动态代...

YZX2018的博客 3328

08-动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动态调用代理方法的一种机制。 我们本课时的面试题是,如何实现动态代理?JDK Proxy 和 CGLib 有什么区别? 典型回答 动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。 但动态代理不止有反射一种实现方式,例如,动态代理可以

cenghaihengliu的博客 476

【Spring】深入解析 Spring AOP:基于动态代理相关 API + 反射操作的 JDK 动态代理、CGLIB 动态代理代码实现和两种动态代理模式的区别

Proxy.newProxyInstance、InvocationHandler、invoke、method.invoke、反射、MethodInterceptor、Callback、intercept、JDK17模块化限制导致的CGLIB动态代理反射访问异常 InaccessibleObjectException、MethodProxy、Method、Enhancer.create

OuO-1 的博客 1172

对话面试官:动态代理是如何实现的?JDK Proxy 和 CGLib 有啥区别?

推荐学习 牛掰!“基础-中级-高级”Java程序员面试集结,看完献出我的膝盖 “68道 Redis+168道 MySQL”精品面试题(带解析),你背废了吗? 知识解读 动态代理的常用实现方式是反射。反射机制是指程序在运行期间可以访问、检测和修改其本身状态或行为的一种能力,使用反射我们可以调用任意一个类对象,以及类对象中包含的属性及方法。 但动态代理不止有反射一种实现方式,例如,动态代理可以通过 CGLib 来实现,而 CGLib 是基于 ASM(一个 Java 字节码操作框架)而非反射实现的

m0_67778103的博客 254

Spring 动态代理与CGLIB

通俗易懂!Spring 动态代理 vs CGLIB 一次讲透(2025 面试必考,画图+口诀,背完直接秒杀)

likuoelie的博客 1076

面试官:动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?

若有收获,请记得分享和转发哦90% 的程序员直接或者间接的使用过动态代理,无论是日志框架或 Spring 框架,它们都包含了动态代理的实现代码。动态代理是程序在运行期间动态构建代理对象和动...

IT技术精选文摘 417
上一篇: SerializationException报错的解决方法,亲测有效,嘿嘿嘿
下一篇: com.alibaba.com.caucho.hessian.io.HessianProtocolException报错的解决方法,亲测有效,嘿嘿嘿
代码无疆
博客等级 码龄3年 4万+粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值