反射是java运行时动态获取类信息并操作成员的能力,核心通过class对象实现“代码控制代码”,但带来性能开销与封装破坏。

反射是 Java 在运行时动态获取类信息、操作类成员(字段/方法/构造器)的能力,核心是通过 Class 对象桥接字节码与实例,实现“代码控制代码”的灵活性——但以性能开销和破坏封装为代价。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
反射的核心三步曲
• 获取 Class 对象:三种方式——Class.forName("全限定名")(适合配置驱动)、对象.getClass()(安全可靠)、MyClass.class(编译期确定,零开销)
• 获取成员:用 getDeclaredXXX() 看本类所有(含 private),用 getXXX() 只看 public 且含父类继承的
• 打破访问限制:调用 setAccessible(true) 绕过 JVM 访问检查(注意模块系统下可能受限)
典型用途一句话定位
• 框架底层:Spring IOC 创建 Bean、MyBatis 封装 ResultSet 到实体类、JUnit 运行测试方法
• 通用工具:JSON 序列化(如 Gson 读取字段)、通用 DAO 的自动映射、动态代理生成
• 测试调试:Mock 私有方法、强制修改 final 字段(仅限测试环境)
必须提的两个硬伤
• 性能低:方法调用比直接调用慢 5–10 倍(JVM 无法内联+安全检查+类型擦除后泛型信息丢失)
• 安全风险:绕过访问控制,违反封装原则;编译期检查失效,错误拖到运行时(如方法名拼错)
• 补充提醒:Android 上反射受 ProGuard/R8 混淆影响,需保留相关类和成员规则
面试加分点收尾
反射不是“炫技工具”,而是框架作者的“基础设施语言”。日常业务代码应避免滥用;真要用,优先考虑 MethodHandle(JDK7+,更轻量)或 VarHandle(JDK9+,替代不安全的 field 操作)作为现代替代方案。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










