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大避坑方案,既能应对面试,也能搞定开发中动态调用场景。收藏本文,需要时直接查阅!

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

相关推荐
cookqq2 小时前
踩坑记:MySQL 连接 URL 缺失useCursorFetch参数引发的 Java 内存溢出惨案
java·mysql
2501_946213902 小时前
Zettlr(科研笔记) v4.0.0 中文免费版
java·经验分享·笔记·pdf·github·ocr·开源软件
fanruitian2 小时前
springboot openai 调用functioncall
java·spring boot·spring·ai·springai
东北赵四2 小时前
JVM实践(调优)
java·jvm
we1less2 小时前
[audio] AudioTrack (五) 共享内存创建分析
android·java·开发语言
MarkHD2 小时前
智能体在车联网中的应用:第37天 CARLA仿真中的端到端车道保持:基于CNN模仿学习的自动驾驶实践
学习·cnn·自动驾驶
一 乐2 小时前
景区管理|基于springboot + vue景区管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
幽络源小助理2 小时前
SpringBoot+Vue大型商场应急预案管理系统源码 | Java安全类项目免费下载 – 幽络源
java·vue.js·spring boot
lbb 小魔仙2 小时前
【Java】Spring Boot 与 Spring Cloud 整合:微服务架构入门实战
java·spring boot·spring cloud·架构