java反射核心是运行时操作类的机制,包含获取class、访问成员、绕过private限制(setaccessible(true))、动态调用四环节;需理解jvm类加载唯一性、模块化限制、性能损耗及安全边界。

Java 反射不是“关卡”,而是一套运行时操作类的机制。所谓“硬核通关”,其实是掌握获取 Class、访问成员、绕过访问控制、动态调用这四个核心环节,并理解其边界与代价。不靠死记 API,靠逻辑闭环。
拿到 Class 对象是起点
反射一切操作都从 Class 开始,它代表 JVM 中加载后的类元数据。三种方式本质不同:
-
User.class:编译期已知类,安全高效,不触发类初始化 -
userObj.getClass():已有实例时用,类型精确(带泛型擦除信息) -
Class.forName("com.example.User"):运行时按字符串加载,会触发静态块执行,框架配置类名时最常用
注意:三者返回的是同一个 Class 实例(== 比较为 true),JVM 保证每个类仅一个 Class 对象。
读字段、调方法、造对象,分三步走稳
-
字段操作:
getDeclaredField("name")获取私有字段,必须配setAccessible(true)才能读写;getField("name")只找 public 字段(含父类继承的) -
方法调用:
getDeclaredMethod("secret", String.class)获取私有方法,同样需setAccessible(true);invoke(obj, "arg")第一个参数是目标对象(静态方法传 null) -
构造对象:优先用
getDeclaredConstructor(String.class, int.class).newInstance("a", 1),避免已废弃的clazz.newInstance()(无参且要求 public)
绕过 private 不等于随意滥用setAccessible(true) 在 JDK 9+ 后受模块系统限制,若目标类在 java.base 等强封装模块中,可能抛 InaccessibleObjectException。生产环境慎用,仅限测试、序列化、ORM 映射等受控场景。
性能和安全不是提醒,是红线
- 反射调用比直接调用慢 5–10 倍(JVM 无法内联、校验开销大),高频路径(如循环内)务必缓存
Method/Field对象 - 安全管理器(SecurityManager)已弃用,但企业级容器仍可能通过自定义 ClassLoader 或字节码增强拦截敏感反射行为
- JSON 库、RPC 框架底层用反射解析字段,但对外暴露的是声明式注解(如
@JsonProperty),而非裸反射调用
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











