高级java每日一道面试题-2024年9月18日-设计模式篇-JDK动态代理,CGLIB代理,AspectJ区别?

如果有遗漏,评论区告诉我进行补充

面试官: JDK动态代理,CGLIB代理,AspectJ区别?

我回答:

在Java开发中,代理(Proxy)是一种常用的设计模式,它允许开发者在不修改原有类代码的情况下,通过代理类来控制对原有类的访问,并可以添加额外的功能。Java提供了几种实现代理的方式,包括JDK动态代理、CGLIB代理和AspectJ(虽然AspectJ更多用于面向切面编程,但也可以看作是一种代理技术)。下面分别详细解释这三种代理技术。

1. JDK动态代理

原理:
  • JDK动态代理主要利用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现。它只能代理实现了接口的类。
使用场景
  • 当目标对象实现了至少一个接口时。
  • 需要对方法进行拦截和增强,但不需要修改原始代码。
步骤:
  1. 定义接口:定义业务逻辑接口。
  2. 实现接口:编写具体的业务逻辑实现类。
  3. 创建代理类:使用Proxy.newProxyInstance()方法创建代理实例,需要提供三个参数:
    • 类加载器(ClassLoader
    • 代理类实现的接口列表
    • InvocationHandler实例
  4. 实现InvocationHandler接口:在这个接口的invoke方法中编写代理逻辑。
优点:
  • 简单易用,不需要修改原有类的代码。
  • 代理类是基于接口的,因此具有更好的解耦性。
缺点:
  • 只能代理实现了接口的类。
  • 相对于CGLIB,性能稍差(因为是通过反射实现的)。

2. CGLIB代理

原理:
  • CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它可以在运行时扩展Java类和实现接口。CGLIB通过继承被代理的类来创建动态代理。
使用场景
  • 当目标对象没有实现任何接口时。
  • 需要对方法进行拦截和增强,但不需要修改原始代码。
步骤:
  1. 引入CGLIB库。
  2. 创建一个实现了MethodInterceptor接口的类,并重写intercept方法。
  3. 使用Enhancer类来创建代理对象,需要设置父类(即被代理的类)和MethodInterceptor实例。
优点:
  • 可以代理没有实现接口的类。
  • 性能比JDK动态代理好(因为是通过继承实现的,避免了反射的开销)。
缺点:
  • 由于是通过继承实现的,因此不能代理final类。
  • 增加了类的复杂度,因为会生成大量的类文件。生成的代理类数量较多,可能会增加内存开销。

3. AspectJ

原理:

AspectJ是一个全面的AOP框架,提供了比Spring AOP更强大的AOP功能。AspectJ支持多种类型的切面,包括基于方法的、基于构造函数的、基于字段的等。AspectJ可以在编译时、类加载时或运行时织入切面。

使用场景
  • 需要全面的AOP支持,包括对方法、构造函数、字段等的切面。
  • 需要在编译时、类加载时或运行时织入切面。
实现方式
  • 编译时织入:使用AspectJ编译器(ajc)在编译阶段织入切面。
  • 类加载时织入:使用AspectJ的LTW(Load-Time Weaving)功能,在类加载时织入切面。
  • 运行时织入:使用AspectJ的RTW(Runtime Weaving)功能,在运行时织入切面。
优点:
  • 提供了全面的AOP支持。
  • 支持多种织入时机,灵活性高。
  • 性能较好,尤其是在编译时织入的情况下。
缺点:
  • 学习曲线较陡峭。
  • 需要引入额外的工具和配置。
  • 在某些情况下可能会影响代码的可读性和维护性。

总结

  • JDK动态代理适用于目标类实现了接口的情况,简单易用,但只能代理实现了接口的类。
  • CGLIB代理适用于目标类没有实现接口的情况,性能较好,但需要引入额外的库,并且不能代理final类或final方法。
  • AspectJ提供了最全面的AOP支持,适用于复杂的AOP需求,支持多种织入时机,但学习成本较高,配置也相对复杂。

在面试中,能够清晰地解释这三种代理机制的工作原理、适用场景以及各自的优缺点,将有助于展示你对AOP技术和代理模式的深入理解。此外,实际项目经验也是面试官非常看重的部分,因此准备好相关的项目案例来说明你的实践经历也是非常有帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/54785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[51单片机] 简单介绍 (一)

文章目录 1.单片机介绍2.单片机内部三大资源3.单片机最小系统4.STC89C52RC单片机 1.单片机介绍 兼容Intel的MCS-51体系架构的一系列单片机。 STC89C52:8K FLASH、512字节RAM、32个IO口、3个定时器、1个UART、8个中断源。 单片机简称MCU单片机内部集成了CPU、RAM、…

Maxim(美信)—MAX20079AATP/VY PMIC芯片详解

写在前面 本系列文章主要讲解Maxim(美信)—MAX20079AATP/VY PMIC芯片的相关知识,希望能帮助更多的同学认识和了解MAX20079AATP/VY芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) PMIC是Power Management Int…

CC面试准备

半导体基础 半导体是介于导体和绝缘体之间的一种介质,在不同条件下表现出不同的导电性或者不导电特性, 电子半导体器件材料大部分为硅,锗等元素 本征半导体:完全不含杂质的纯净半导体,因为不含杂质,其中…

QT widgets 窗口缩放,自适应窗口大小进行布局

1. 窗口布局 2. 尺寸策略:扩展 Fixed (固定): 行为:控件的大小是固定的,不会随着窗口大小的变化而改变。它的大小由控件的 sizeHint() 返回的值决定。 适用场景:当你希望控件的大小保持不变,不随布局调整时使用&#x…

RAG+Agent人工智能平台:RAGflow实现GraphRA知识库问答,打造极致多模态问答与AI编排流体验

1.RAGflow简介 全面优化的 RAG 工作流可以支持从个人应用乃至超大型企业的各类生态系统。大语言模型 LLM 以及向量模型均支持配置。基于多路召回、融合重排序。提供易用的 API,可以轻松集成到各类企业系统。支持丰富的文件类型,包括 Word 文档、PPT、exc…

前端报错401 【已解决】

前端报错401 【已解决】 在前端开发中,HTTP状态码401(Unauthorized)是一个常见的错误,它表明用户试图访问受保护的资源,但未能提供有效的身份验证信息。这个错误不仅关乎用户体验,也直接关系到应用的安全性…

Uniapp时间戳转时间显示/时间格式

使用uview2 time 时间格式 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 <text class"cell-tit clamp1">{{item.create_time}} --- {{ $u.timeFormat(item.create_time, yyyy-mm-dd hh:MM:ss)}} </text>

OpenAI发布多语言MMMLU数据集;火山引擎发布AI视频生成大模型豆包

&#x1f989; AI新闻 &#x1f680; OpenAI发布多语言MMMLU数据集 摘要&#xff1a;OpenAI在Hugging Face上推出了多语言大规模多任务语言理解&#xff08;MMMLU&#xff09;数据集&#xff0c;旨在评估大型语言模型在各种语言和任务中的表现。该数据集涵盖广泛的主题与学科…

记某学校小程序漏洞挖掘

前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#xff0c;奇葩弱口令离谱进去&#xff0c;站点里面越权泄露敏感信息&#xff0c;接管账号等漏洞&#xff01;&#xff01;&#xff01; 渗透思路 1.绕过前端 …

代码随想录算法训练营Day14 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

目录 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 226.翻转二叉树 题目 226. 翻转二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例1&#…

[网络] 网络层--IP协议

目录 一、IP协议 1.1 基本概念 1.2 IP协议报头 1.3 如何将报头和有效载荷分离和分用 1.4 分片与组装 1.5 如何减少分片&#xff1f; 1.6 分片和封装的具体过程 二、网段划分 2.1 再次理解IP地址 2.2 了解DHCP 2.3 网络划分方案 2.4 为什么要进行网络划分 2.5 特殊的…

接口加解密及数据加解密

目录 一、 加解密方式介绍 1.1 Hash算法加密 1.2. 对称加密 1.3 非对称加密 二、 我们要讲什么&#xff1f; 三、 接口加解密 四、 数据加解密 一、 加解密方式介绍 所有的加密方式我们可以分为三类&#xff1a;对称加密、非对称加密、Hash算法加密。 算法内部的具体实现…

【html】基础(二)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;js专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &am…

http增删改查四种请求方式操纵数据库

注意&#xff1a;在manage.py项目入口文件中的路由配置里&#xff0c;返回响应的 return语句后面的代码不会执行&#xff0c;所以路由配置中每个模块代码要想都执行&#xff0c;不能出现return 激活虚拟环境&#xff1a;venv(我的虚拟环境名称&#xff09;\Scripts\activate …

Unity3D 小案例 像素贪吃蛇 03 蛇的碰撞

Unity3D 小案例 像素贪吃蛇 第三期 蛇的碰撞&#xff08;完结&#xff09; 像素贪吃蛇 碰撞蛇身 当蛇头碰撞到蛇身时&#xff0c;游戏应该判定为失败。 找到蛇身预制体&#xff0c;添加 Body 标签和碰撞体&#xff0c;碰撞体的大小为 0.5&#xff0c;跟蛇头和蛇身的碰撞体范…

AlDente Pro for Mac电池健康保护工具

AlDente Pro for Mac 是一款适用于 Mac 的实用电池健康保护工具。以下是它的主要特点和优势&#xff1a; 软件下载地址 一、保护电池寿命的原理 锂离子和聚合物电池&#xff08;如 Mac 笔记本中的电池&#xff09;在 30% 到 80% 之间运行时使用寿命最长。始终将电池电量保持…

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载

Windows 10 on ARM, version 22H2 (updated Aug 2024) ARM64 AArch64 中文版、英文版下载 基于 ARM 的 Windows 10 请访问原文链接&#xff1a;https://sysin.org/blog/windows-10-arm/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;s…

【VUE3.0】动手做一套像素风的前端UI组件库---Message

目录 引言自己整一个UI设计稿代码编写1. 设计信息窗口基础样式2. 设置打开和关闭的方法3. 编写实例化组件的js文件4. 看下最终效果5. 组件完整代码6. 组件调用方式 总结 引言 本教程基于前端UI样式库 NES.css 的UI设计&#xff0c;自行研究复现。欢迎大家交流优化实现方法~ 此次…

《线性代数》学渣笔记

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算&#xff08;化为基本型&#xff09;1.5.1 主对角线行列式&#xff1a;主…

基于数据挖掘的航空客户满意度分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求&#xff0c;包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等&#xff0c;并希望以此提升乘…