Java反射核心在于理解运行时动态操作类的本质,以Class对象为唯一入口,熟练运用Field/Method/Constructor三类API;获取Class对象有三种方式,操作需注意访问控制与适用场景,且须权衡性能与封装性。

一、先抓住反射的唯一支点:Class 对象
所有反射操作都从它开始,没有 Class 对象,就没有反射。
它不是你 new 出来的,是 JVM 在类加载时自动生成的,每个类有且仅有一个。
获取方式就三种,记牢适用场景:
- 类名.class:编译期已知类,最安全、不触发初始化(推荐日常用)
- 对象.getClass():已有实例但类型不确定,比如处理泛型擦除后的 Object
- Class.forName("全限定名"):配置驱动、插件化、框架加载(会执行静态块!)
二、再打通三大操作主线:字段、方法、构造器
拿到 Class 对象后,就按需“拆解”它:
- 查字段(Field):用 getDeclaredFields() 获取全部字段(含 private),setAccessible(true) 才能读写
- 调方法(Method):getDeclaredMethod("xxx", String.class) 定位方法,invoke(obj, "arg") 执行;私有方法同样要 setAccessible
- 建实例(Constructor):getDeclaredConstructor(String.class) 拿构造器,newInstance("张三") 创建对象;private 构造器也照常可用
三、最后认清边界:什么时候该用,什么时候别碰
反射不是银弹,用错比不用更危险:
- 适合场景:框架开发(Spring Bean 创建、MyBatis 参数绑定)、注解处理器、通用工具类(如对象深拷贝、JSON 序列化)、测试 Mock
- 慎用场景:高频调用路径(性能差 5–50 倍)、强封装要求的模块(破坏 encapsulation)、安全敏感系统(绕过访问控制)
- 替代思路:优先考虑接口+工厂、Lambda 表达式、Records、sealed class 等现代 Java 特性


















