CSDN Java反射

吃透Java反射:面试必问+实战避坑,一篇搞定

一、前言

Java反射堪称后端必学核心,面试高频问底层,开发常用它做框架封装(Spring/IOC)、动态调用,新手易踩权限、性能坑。本文极简讲透 核心概念+实操+避坑+面试考点,短小精悍,收藏直接用!

二、什么是Java反射?一句话看懂

反射是Java动态性核心,允许程序运行时获取类的完整信息(属性、方法、构造器),还能动态创建对象、调用方法、修改属性,无需编译时明确指定类名,打破封装性,灵活但慎用。

配图1:Java反射核心流程示意图(简洁版)

左侧「运行时」→ 中间核心动作(获取Class对象→获取类信息→动态操作)→ 右侧应用场景(框架封装、动态代理),极简线条+文字标注,一眼看懂流程

三、反射核心4大类+核心步骤(附实操代码)

反射核心围绕java.lang.reflect包4个类,核心步骤仅2步,代码可直接复制运行!

  1. 反射2大核心步骤(必记)

  2. 获取目标类的Class对象(反射入口,3种方式);

  3. 通过Class对象,操作类的构造器/方法/属性。

  4. 实操:3种方式获取Class对象(面试常问)

java

// 目标类:简单实体类

public class User {

private String name;

private Integer age;

// 无参+有参构造+get/set省略

}

// 方式1:类名.class(最常用,编译期确定)

Class<User> clazz1 = User.class;

// 方式2:对象.getClass()(已有对象时使用)

User user = new User();

Class<? extends User> clazz2 = user.getClass();

// 方式3:Class.forName("全类名")(动态加载,最灵活,面试高频)

Class<?> clazz3 = Class.forName("com.test.User");

配图2:3种获取Class对象代码运行截图

标注3种方式的执行结果,统一展示Class对象实例,简单直观,帮读者验证代码

  1. 4大核心类实操(实战常用)

聚焦开发/面试高频场景,只讲有用的,不冗余!

(1)Field:获取/修改类的属性(含私有属性)

java

// 1. 获取Class对象

Class<User> clazz = User.class;

// 2. 获取私有属性(setAccessible(true)打破封装,必备)

Field nameField = clazz.getDeclaredField("name");

nameField.setAccessible(true); // 关闭访问检查,操作私有属性必加

// 3. 动态创建对象+修改属性

User user = clazz.newInstance();

nameField.set(user, "张三");

// 4. 获取属性值

System.out.println(nameField.get(user)); // 输出:张三

(2)Constructor:动态创建对象(优先有参构造)

java

// 获取有参构造器(参数类型对应)

Constructor<User> constructor = clazz.getDeclaredConstructor(String.class, Integer.class);

// 动态创建对象

User user2 = constructor.newInstance("李四", 20);

(3)Method:动态调用方法(含私有方法)

java

// 获取私有方法(方法名+参数类型)

Method setAgeMethod = clazz.getDeclaredMethod("setAge", Integer.class);

setAgeMethod.setAccessible(true);

// 动态调用方法

setAgeMethod.invoke(user2, 25);

System.out.println(user2.getAge()); // 输出:25

配图3:反射操作4大核心类汇总图(表格式配图)

列头:核心类、作用、关键方法、注意事项,清晰明了,方便读者快速查阅记忆

四、反射核心应用场景(面试/开发必知)

  1. 框架底层:Spring IOC容器通过反射创建Bean、MyBatis通过反射映射结果集;

  2. 动态代理:AOP底层依赖反射实现方法增强;

  3. 注解解析:自定义注解+反射,实现接口权限校验、日志记录;

  4. 动态配置:运行时根据配置文件,动态调用指定类和方法。

五、反射3大坑+避坑方案(面试高频问)

  1. 权限坑:操作私有成员必须加 setAccessible(true) ,否则抛IllegalAccessException;

  2. 性能坑:反射跳过编译检查,性能比直接调用慢,避坑:减少反射调用次数+缓存Class/Method对象;

  3. 安全坑:打破封装性,可能篡改私有属性,避坑:生产环境避免随意反射核心类。

六、面试高频3问(背完就能答)

  1. 反射的核心是什么?答:获取Class对象,运行时动态操作类的成员,实现动态性;

  2. 反射创建对象有几种方式?答:2种,clazz.newInstance()(无参构造)、Constructor.newInstance()(无参/有参,推荐);

  3. 反射的优缺点?答:优点:灵活,支持动态加载,适配框架开发;缺点:性能差、打破封装、有安全风险。

七、总结

Java反射是后端必备技能,核心记住「获取Class对象→动态操作成员」,掌握4大核心类+3大避坑方案,既能应对面试,也能搞定开发中动态调用场景。收藏本文,需要时直接查阅!

评论区互动:你在项目中用过反射做什么?踩过哪些坑?

相关推荐
IT枫斗者枫哥2 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟2 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo2 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕2 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
花开路口2 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
运行时异常2 小时前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java
她的男孩2 小时前
开放接口限流从 20 改到 200 还是每分钟 20 次:拆完防重放+幂等+限流,我找到 5 个静默失效的坑
java·后端·架构
天天被压力2 小时前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·人工智能·python
天天被压力2 小时前
【Python 量化取数指南 #14】Python 清洗行情数据:复权停牌对齐,回测不翻车
java·人工智能·python
独泪了无痕2 小时前
开发利器Hutool之MapUtil的使用
java·后端