怎么样才算是用到了反射呢?有什么关键特征吗

文章目录

      • [特征一:出现了反射的核心四大金刚(Class, Method, Field, Constructor)](#特征一:出现了反射的核心四大金刚(Class, Method, Field, Constructor))
      • 特征二:通过"字符串"来找类、找方法
      • [特征三:能强行突破封装(无视 `private` 关键字)](#特征三:能强行突破封装(无视 private 关键字))
      • [🧱 哪些我们常用的框架天天在用反射?](#🧱 哪些我们常用的框架天天在用反射?)
      • 总结一张表

要判断一段代码是不是用到了反射(Reflection),其实有一个最直观的黄金法则:

💡 看它在写代码时,知不知道自己正在操作的"类名"、"方法名"或"属性名"是什么。

如果是普通的写代码,类名和方法名都是写死(硬编码)的。而反射的特征是:在运行期间,通过"字符串"或者"传参"来动态地探查、调用和摆弄一个类。

以下是反射的 3 大核心关键特征,只要符合其中之一,就是用到了反射:


特征一:出现了反射的核心四大金刚(Class, Method, Field, Constructor)

这是最明显的物理特征。Java 中反射的 API 非常固定,你的代码里如果出现了以下这些类,那就是铁证如山用到了反射:

  • Class:类的结构对象
  • Method:类的方法对象
  • Field:类的属性/字段对象
  • Constructor:类的构造函数对象

特征二:通过"字符串"来找类、找方法

普通代码中,你要 new 一个对象、调用一个方法,必须在代码里老老实实写出它的名字。而反射可以通过一个字符串变量去搞定一切。

❌ 普通写法(非反射):

类名 User 必须死死写在代码里。编译时如果不存在 User 类,直接报错。

java 复制代码
User user = new User();
user.sayHello(); 
反射写法(通过字符串):

代码里没有任何 User 字样,类名、方法名全是从外部传进来的字符串。程序跑起来之后,动态去内存里"捞"这个类。

java 复制代码
String className = "com.walissh.model.User"; // 甚至可以从配置文件里读出来
String methodName = "sayHello";

// 1. 根据字符串,动态加载类
Class<?> clazz = Class.forName(className); 

// 2. 动态创建实例(相当于 new)
Object userObj = clazz.getDeclaredConstructor().newInstance(); 

// 3. 根据字符串,动态获取方法并执行
Method method = clazz.getDeclaredMethod(methodName);
method.invoke(userObj); // 执行 sayHello() 方法

特征三:能强行突破封装(无视 private 关键字)

Java 的 private 关键字是为了实现封装,防止外部类直接访问。但**反射拥有一把能撬开一切锁的"万能钥匙":.setAccessible(true)**

如果你看到代码里强行去获取私有属性,并且给它开锁,这就是典型的反射操作:

java 复制代码
public class Bank {
    private String password = "123"; // 私有属性,正常情况外部绝对无法访问
}

// ---- 外部反射盗取密码 ----
Bank bank = new Bank();

Field field = Bank.class.getDeclaredField("password");
field.setAccessible(true); // 🔑 关键特征:暴力反射,强行开锁!

String pwd = (String) field.get(bank); // 强行拿到了 "123"

🧱 哪些我们常用的框架天天在用反射?

虽然我们自己写业务代码(CRUD)很少手动写反射,但你用的框架其实全是靠反射撑起来的:

  1. Spring 的依赖注入(如 @Resource / @Autowired
    Spring 怎么知道要把你的 Service 注入到 Controller 里的?它就是在启动时,通过反射去扫描你的类,看到有这个注解,就通过反射把实例塞进你的私有变量里。
  2. JSON 解析工具(如你的代码里用的 Fastjson / Jackson)
    JSON.toJSONString(user) 为什么能把一个普通的 Java 对象转成 JSON 字符串?它底层就是用反射 去遍历这个 user 对象里有哪些 Field(属性),然后把属性名和属性值拼成字符串的。
  3. JDBC / MyBatis 结果集映射
    从数据库查出来一行数据,MyBatis 怎么自动帮你封装成一个 User 对象的?它先用反射 newInstance() 创建一个空对象,再用反射把字段值一个个填进去。

总结一张表

维度 普通代码 反射代码
操作对象 明确的类、明确的方法 字符串、未知的方法
错误暴露 编译期:类名写错,编译直接报错。 运行期 :写错字符串编译没事,一运行就抛 ClassNotFoundException
执行权限 只能访问 public / 遵守规则 可以设置 setAccessible(true) 强行看 private
相关推荐
论迹复利1 小时前
FreeRTOS 在 RISC-V 上是如何“点火“的 —— 从 main() 到第一个任务的完整链路
java·开发语言·risc-v
张宇Joaquin1 小时前
鲲鹏统一并行加速库KUPL--众核并行能力介绍
java·开发语言·网络
宸津-代码粉碎机2 小时前
AI攻防战升级!基于Spring AI构建Java应用自动免疫安全体系
java·大数据·开发语言·人工智能·python·安全·spring
2601_963749103 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh3 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝4 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java4 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
lhldsg5 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app
Freak嵌入式5 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
devilnumber6 小时前
Oracle 与 MySQL substr 函数差异总结
java·数据库·mysql·oracle