Java反射核心是建立“类→Class→组件→操作”链路,关键在于理解Class对象为唯一入口,分四步:获取Class、解析结构、安全调用、场景闭环验证。

Java 反射通关演练,关键不在堆代码,而在建立“类→Class→组件→操作”的清晰链路。掌握它不靠死记API,而靠理解JVM加载后留下的那个唯一Class对象——它是所有反射动作的唯一入口和总开关。
第一步:稳准拿到 Class 对象
没Class,就等于没钥匙。三种方式不是并列选项,而是对应不同场景:
- 类名.class:编译期已知类型,比如写工具类时固定处理String或List,安全、零异常、性能最优
- 对象.getClass():已有实例但类型不确定(如Object参数),适合泛型擦除后的运行时类型判断
- Class.forName("全限定名"):配置驱动、插件化、RPC反序列化等场景,真正体现“动态”——类名来自字符串,甚至来自数据库或网络
注意:Class.forName()会触发类初始化(执行static块),而类名.class不会;同一个类无论怎么获取,得到的Class对象都是==相等的。
第二步:按需拆解类结构
拿到Class后,别急着调用,先看清它“长什么样”:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
立即学习“Java免费学习笔记(深入)”;
-
字段(Field):用
getDeclaredFields()拿到全部声明字段(含private),再用setAccessible(true)解除访问限制;若要父类字段,需递归遍历getSuperclass() -
方法(Method):区分
getMethod()(只找public,含继承)和getDeclaredMethod()(本类所有,含private);注意参数类型必须精确匹配,int.class不能用Integer.class代替 -
构造器(Constructor):优先用
getDeclaredConstructor(参数类型...),避免过时的newInstance();私有构造器同样需setAccessible(true)
第三步:安全、可控地执行操作
反射调用不是“越权即用”,而是明确意图、最小权限:
- 调用方法前,检查
method.getModifiers()是否含Modifier.STATIC,决定invoke时传null还是实例 - 修改字段前,用
field.getType()确认类型,避免IllegalArgumentException - 所有反射调用都可能抛出
IllegalAccessException、InvocationTargetException等,建议统一用try-catch包裹,不要裸奔 - JDK 9+ 模块系统下,若遇
InaccessibleObjectException,需在启动参数加--add-opens,而非盲目设setAccessible(true)
第四步:在真实场景中闭环验证
脱离场景练反射,就像背菜谱不炒菜。三个轻量但典型的闭环练习:
- 通用对象拷贝器:不依赖任何框架,仅用反射遍历源对象所有非static字段,把值复制到目标对象同名字段(自动跳过final字段)
- 注解驱动的日志拦截:定义@Loggable注解,扫描被标注的方法,在反射调用前打印入参,调用后打印返回值
-
配置化Bean工厂:读取properties文件中的
user.class=com.example.User和user.age=28,用反射创建实例并赋值
每个练习做完,都该能回答:Class从哪来?字段/方法怎么找?访问控制怎么绕?异常怎么兜底?——这才是通关的标尺。

















