动态代理有哪些实现方式?

简介: 动态代理是一种在运行时创建代理对象的技术,它可以在不修改目标对象的情况下,通过代理对象来增强目标对象的功能。在Java中,有两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。
  1. JDK动态代理:
    JDK动态代理是基于接口的代理,它要求目标对象实现一个接口。JDK动态代理使用Java的反射机制来创建代理对象。下面是JDK动态代理的实现步骤:
    (1) 定义一个接口:首先需要定义一个接口,该接口是目标对象和代理对象都要实现的。
    (2) 实现InvocationHandler接口:创建一个实现InvocationHandler接口的类,该类负责实现代理逻辑。
    (3) 使用Proxy类创建代理对象:通过Proxy类的静态方法newProxyInstance()创建代理对象,该方法需要传入一个类加载器、一个接口数组和一个InvocationHandler对象。
    (4) 调用代理对象的方法:通过代理对象调用方法时,实际上会调用InvocationHandler的invoke()方法,代理逻辑就在该方法中实现。

JDK动态代理的优点是它是Java官方提供的标准动态代理实现方式,使用简单,无需引入第三方库。但它的缺点是只能代理实现了接口的类,无法代理没有实现接口的类。

  1. CGLIB动态代理:
    CGLIB动态代理是基于类的代理,它可以代理没有实现接口的类。CGLIB动态代理使用字节码生成技术来创建代理对象。下面是CGLIB动态代理的实现步骤:
    (1) 导入CGLIB库:首先需要导入CGLIB库的依赖。
    (2) 创建Enhancer对象:创建Enhancer对象,并设置目标类作为其父类。
    (3) 设置回调函数:通过调用setCallback()方法,设置MethodInterceptor接口的实现类作为回调函数。
    (4) 创建代理对象:通过调用create()方法,创建代理对象。
    (5) 调用代理对象的方法:通过代理对象调用方法时,实际上会调用MethodInterceptor的intercept()方法,代理逻辑就在该方法中实现。

CGLIB动态代理的优点是它可以代理没有实现接口的类,使用灵活。但它的缺点是需要引入CGLIB库,增加了项目的依赖。

选择使用哪种动态代理方式应根据具体需求和场景来决定。如果目标对象已经实现了接口,推荐使用JDK动态代理;如果目标对象没有实现接口,或者需要对目标对象的类进行代理,推荐使用CGLIB动态代理。

目录
相关文章
|
计算机视觉 Python
Yolov5双目测距-双目相机计数及测距教程(附代码)
Yolov5双目测距-双目相机计数及测距教程(附代码)
|
存储 开发工具 git
helm v2 源大全
helm v2 源大全
|
7月前
|
供应链 算法 搜索推荐
从公布的前十一批其他算法备案通过名单分析
2025年3月12日,国家网信办发布算法备案信息,深度合成算法通过395款,其他算法45款。前10次备案中,深度合成算法累计3234款,其他类别647款。个性化推送类占比49%,涵盖电商、资讯、视频推荐;检索过滤类占31.53%,用于搜索优化和内容安全;调度决策类占9.12%,集中在物流配送等;排序精选类占8.81%,生成合成类占1.55%。应用领域包括电商、社交媒体、物流、金融、医疗等,互联网科技企业主导,技术向垂直行业渗透,内容安全和多模态技术成新增长点。未来大模型检索和多模态生成或成重点。
从公布的前十一批其他算法备案通过名单分析
|
12月前
|
运维 Kubernetes 监控
掌握Docker容器化技术:构建、部署与管理的高效实践
【10月更文挑战第14天】掌握Docker容器化技术:构建、部署与管理的高效实践
307 0
|
7月前
|
安全 程序员 Windows
程序员必备工具:Xshell 7专业版安装与优化全攻略
Xshell 7 是一款由韩国 NetSarang 公司开发的终端模拟器,专为Windows系统设计,广泛用于远程连接和服务器管理。本文详细介绍其下载、安装流程及配置方法,包括界面语言设置、新建会话连接、高级功能如多窗口布局与脚本自动化,还提供了常见问题解答,帮助用户高效使用软件。
929 12
|
11月前
|
Linux 开发工具 Windows
CentOS8 64位系统 搭建内网穿透frp
【10月更文挑战第23天】本文介绍了如何在Linux系统上搭建frp内网穿透服务,并配置Windows客户端进行访问。首先,通过系统信息检查和软件下载,完成frp服务端的安装与配置。接着,在Windows客户端下载并配置frpc,实现通过域名访问内网地址。最后,通过创建systemd服务,实现frp服务的开机自动启动。
761 20
|
传感器 JavaScript 前端开发
TypeScript高频面试题汇总
大家好,我是 CoderBin,本次总结了关于TypeScript的一些高频面试题,希望对大家有所帮助,谢谢。 如果文中有不对、疑惑的地方,欢迎在评论区留言指正🌻
2615 1
TypeScript高频面试题汇总
|
存储 缓存 NoSQL
每秒30W次的点赞业务,怎么优化?
30WQPS的点赞计数业务,如何设计?
1218 0
每秒30W次的点赞业务,怎么优化?
|
存储 JavaScript
如果需要在组件之间共享一个`ref`,应该如何实现?
如果需要在组件之间共享一个`ref`,应该如何实现?
213 0
|
Java 开发者
Java中的受检异常和非受检异常的区别
Java中的受检异常和非受检异常的区别