【Java面试笔记:基础】6.动态代理是基于什么原理?

1. 反射机制

  • 定义:反射是 Java 语言提供的一种基础功能,允许程序在运行时自省(introspect),直接操作类或对象。
  • 功能:
    • 获取类定义、属性和方法。
    • 调用方法或构造对象。
    • 运行时修改类定义。
  • 应用场景:
    • O/R Mapping 框架:通过反射自动生成 settergetter,简化数据加载和持久化。
    • 绕过 API 访问控制:使用反射绕开访问限制,例如释放 DirectBuffer
  • 限制:Java 9 引入模块化系统后,对反射访问进行了限制,需要显式声明模块间的访问权限。

2. 动态代理

  • 定义:动态代理是一种运行时动态构建代理对象、处理代理方法调用的机制。
  • 应用场景:
    • 包装 RPC 调用。
    • 面向切面编程(AOP)。
  • 实现方式:
    • JDK 动态代理:基于反射机制实现,要求目标对象实现接口。
    • cglib 动态代理:基于字节码操作机制(如 ASM)实现,通过创建目标类的子类来实现代理。

3. JDK 动态代理

  • 优势:
    • 最小化依赖关系,减少开发和维护工作量。
    • 平滑进行 JDK 版本升级。
    • 实现简单。
  • 限制:以接口为中心,要求目标对象实现接口,适用范围有限。

4. cglib 动态代理

  • 优势:
    • 不依赖接口,适用于没有实现接口的目标对象。
    • 高性能。
  • 实现方式:通过创建目标类的子类实现代理。

5. 动态代理 vs CGLIB

特性 动态代理 CGLIB
代理方式 基于接口 基于类继承
性能 反射调用较慢 通过ASM生成字节码,性能更高
依赖 JDK原生支持 需要引入第三方库
方法限制 只能代理接口方法 可代理类中的非final方法

6. 选择动态代理实现的依据

  • 可靠性:JDK 动态代理更加可靠,因为它是 JDK 自带的功能。
  • 可维护性:JDK 动态代理的代码实现简单,易于维护。
  • 性能:虽然 cglib 在某些场景下性能更高,但在大多数情况下,JDK 动态代理的性能已经足够。
  • 适用性:如果目标对象实现了接口,优先选择 JDK 动态代理;如果没有实现接口,可以考虑 cglib

7. AOP 与动态代理

  • AOP(面向切面编程):通过动态代理机制,将通用逻辑(如日志、事务、安全等)与业务逻辑分离,提高代码的抽象程度和复用度。
  • 应用场景:日志记录、事务管理、用户鉴权、性能监控等。

8. 总结

  • 反射机制:赋予了 Java 语言运行时自省的能力,是动态代理的基础。
  • 动态代理:通过代理机制,可以优雅地解决繁琐的重复编程问题,广泛应用于 RPCAOP 等场景。
  • 实现方式:JDK 动态代理和 cglib 动态代理各有优势,选择时需要综合考虑可靠性、可维护性、性能和适用性。
相关推荐
天天扭码几秒前
RESTful API 接口设计小白入门:从概念到实战全解析
面试·架构·restful
AronTing几秒前
策略模式:动态切换算法的设计智慧
java·后端·面试
爱的叹息1 分钟前
查看Spring Boot项目所有配置信息的几种方法,包括 Actuator端点、日志输出、代码级获取 等方式,附带详细步骤和示例
java·spring boot·后端
Kendra9196 分钟前
面试网络基础知识 — IP地址
网络·tcp/ip·面试
蜗牛03146 分钟前
Redis在SpringBoot中的使用
java·spring boot·redis
工业互联网专业13 分钟前
基于springboot+vue的医院管理系统
java·vue.js·spring boot·毕业设计·源码·课程设计·医院管理系统
火星思想15 分钟前
再来看看「从输入 URL 到看到页面」的整个流程
前端·面试
AronTing18 分钟前
代理模式:控制对象访问的中间层设计
前端·面试
Cutey91623 分钟前
Vue 中的高阶函数:提升代码复用与组件抽象的利器
前端·javascript·面试