什么是反射

一种java的基础API,通过实例动态地获取和操作一个类/对象的所有内部信息的能力,甚至可无视 private限制

反射的好处

极大的灵活性、通用性

可以编写“通用代码”,在运行时再动态地决定加载谁、执行谁

反射应用场景

  • 框架: Spring、MyBatis 等框架用它来实现 IoC/DI (依赖注入) 和 AOP (动态代理)
  • 动态加载: 比如 Class.forName() 根据配置文件里的一个类名字符串,在运行时加载该类并创建实例(如 JDBC 驱动)。

反射核心

Class实例:JVM为加载的每个类/接口都创建了一个唯一的 Class对象,它储存了该类型的所有元数据(名字、方法、字段等)

访问字段

通过反射可以获取、设置private类型实例的字段值,但首先要调用 setAccessible(true)

  • 反射是一种非常规手段

动态代理

两种方式

  • JDK 动态代理:JDK提供的动态创建接口对象的方式
  • CGLIB 动态代理(第三方库,Spring 框架大量使用)
  • 区别
对比维度 JDK 动态代理 CGLIB 动态代理
实现原理 在运行时,动态实现目标类所实现的接口,造出一个“兄弟”类。 在运行时,动态继承目标类,造出一个“儿子”类(子类)。
核心要求 目标类必须实现接口 目标类不能是 final(因为 final 类无法被继承)。
性能 在早期版本中创建代理较快,但现代 JVM 中两者性能差异已很小。 无法代理 final 方法(因为 final 方法无法被重写)。

原理:拦截+增强

运行时系统给你的不是真实对象,而是造出的一个代理对象(中介),当你调用它的方法时,它会拦截这个调用,执行一些**“增强”**逻辑(自己定义的额外逻辑),最后再可选地调用真实对象

  • 动态代理AOP ( 面向切面编程 ) 的核心技术之一。AOP 允许你把“横切”多个业务的通用功能从业务代码中抽离出来,集中管理。

动/静态代理方法

  • 静态代理(Proxy 设计模式)
    • 思想:在编译期就为特定类手动创建“一对一”的代理类
    • 问题是:如果有100个服务,就必须手动编写100个对应的代理类
  • 动态代理(JDK java.lang.reflect.Proxy
    • 思想:让 JVM 在运行时帮我自动生成这些代理类