高级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.rhkb.cn/news/427478.html

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

相关文章

【Django5】django的helloworld

安装django pip install djangoDjango官方中文文档 https://docs.djangoproject.com/zh-hans/5.1/Github链接 https://github.com/django/django创建Django项目 cd到想要创建项目的文件夹下,输入以下命令创建项目 这行代码将会在当前目录下创建一个 mysite 目录 …

9月26日云技术研讨会 | SOA整车EE架构开发流程及工具实施方案

面向服务的架构(Service Oriented Architecture, SOA)实施需要复杂的基础技术作为支撑,伴随着整车硬件资源的集中化、车载以太网等高速通信技术在车内的部署,将在未来一段时间内成为行业技术研究和市场布局的热点。 近年来&#x…

AD域控服务器

1.AD域控服务器安装 2.客户端Windows10加入域环境 3.组织单位OU和域用户创建 目的是分部门管理用户和使用域用户登录客户端 4.域用户安全策略 5.当客户端密码锁住了,管理员解锁账户。 6.只允许域用户使用自己的电脑 7.域策略 7.1统一客户端桌面壁纸 7.2重定向用户配置文件路径…

【macOS】【zsh报错】zsh: command not found: python

【macOS】【zsh Error】zsh: command not found: python 本地已经安装了Python,且能在Pycharm中编译Python程序并运行。 但是,在macOS终端,运行Python,报错。 首先要确认你在macOS系统下,是否安装了Python。 如果安…

每日刷题(算法)

我们N个真是太厉害了 思路: 我们先给数组排序,如果最小的元素不为1,那么肯定是吹牛的,我们拿一个变量记录前缀和,如果当前元素大于它前面所有元素的和1,那么sum1是不能到达的值。 代码: #def…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…

Eigen3 教程基础篇(三)

参考 Eigen3 主页,Eigen3 官网教程 矩阵的本质,通过多种矩阵的应用去感受矩阵本质 3Blue1Brown 的线性代数,用可视化方法来表现线性代数的特性,强推 如何理解复数和虚数,有动画方便理解复数的意义 相关文章 Eigen…

《ElementUI/Plus 踩坑》el-table + sortablejs 拖拽顺序错乱(Vue2/3适用)

如图所示: 把第一行拖到最后一行,鼠标up;该行莫名其妙的跳到倒数第二行; 最后发现没有设置 el-table 属性 row-key ,即行数据的 Key,用来优化 table 的渲染; 属性 row-key 描述如下&#xf…

YOLOv10轻量化快速涨点之改进AKConv

目录 1,什么是AKConv? 2,如何使用AKConv使YOLOv10快速长点? 2.1,在ultralytics-main/ultralytics/nn/modules/conv.py里面添加AKConv类 2.2,ultralytics-main/ultralytics/nn/modules/conv.py添加如下 2.3 在E:\czc\YOLOv10\ultralytics-main\ultralytics\nn\tasks.p…

算法.图论-并查集上

文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板 1. 并查集介绍 定义: 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所…

1 elasticsearch安装

【0】官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/targz.html 【1】Centos7 下载安装 【1.1】下载 官网:Download Elasticsearch | Elastic 选择好自己想要的相关版本即可; 【2】Centos7.X 前置环境配置(uli…

秦时明月6.2魔改版+GM工具+虚拟机一键端

今天给大家带来一款单机游戏的架设:秦时明月。 另外:本人承接各种游戏架设(单机联网) 本人为了学习和研究软件内含的设计思想和原理,带了架设教程仅供娱乐。 教程是本人亲自搭建成功的,绝对是完整可运行…

【Vmware16安装教程】

📖Vmware16安装教程 ✅1.下载✅2.安装 ✅1.下载 官网地址:https://www.vmware.com/ 百度云盘:Vmware16下载 123云盘:Vmware16下载 ✅2.安装 1.双击安装包VMware-workstation-full-16.1.0-LinuxProbe.Com.exe,点击…

最新动态一致的文生视频大模型FancyVideo部署

FancyVideo是一个由360AI团队和中山大学联合开发并开源的视频生成模型。 FancyVideo的创新之处在于它能够实现帧特定的文本指导,使得生成的视频既动态又具有一致性。 FancyVideo模型通过精心设计的跨帧文本引导模块(Cross-frame Textual Guidance Modu…

C#和数据库高级:抽象类和抽象方法

文章目录 一、为什么使用抽象类和抽象方法?1.1、父类与子类的相互转换 二、抽象类和抽象方法2.1、抽象类的定义和方法声明规范2.2、使用继承多态的机制解决问题 三、抽象类的概念和使用特点总结 一、为什么使用抽象类和抽象方法? 1.1、父类与子类的相互…

考研数据结构——C语言实现有向图邻接矩阵

首先,定义了一些基本的数据结构和常量: VertexType:顶点的数据类型,这里定义为char。EdgeType:边的数据类型,这里定义为int,用于存储权重。MAXVEX:定义了图中最大顶点数为100。INFIN…

C语言——自定义类型

目录 结构体 概念 结构体变量的创建和初始化 结构体的自引用 结构体的内存对齐 内存对齐存在的原因 合理设计结构体 方法一 方法二 结构体传参 结构体实现位段 什么是位段 位段的内存分配 位段的跨平台问题 注意 联合体 概念 验证 优点 小应用 什么是大小…

【Unity】对象池 - 未更新完

自定义泛型对象池 文章目录 自定义泛型对象池封装泛型类例子 使用Unity自带对象池 封装泛型类 public abstract class MyPool<T> : MonoBehaviour where T :Component {[SerializeField] protected T prefab; // 生成的预制体[SerializeField] protected int defaultNum…

鸿蒙环境服务端签名直传文件到OSS

本文介绍如何在鸿蒙环境下将文件上传到OSS。 背景信息 鸿蒙环境是当下比较流行的操作环境&#xff0c;与服务端签名直传的原理类似&#xff0c;鸿蒙环境上传文件到OSS是利用OSS提供的PutObject接口来实现文件上传到OSS。关于PutObject的详细介绍&#xff0c;请参见PutObject。…

VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…