当前位置: 首页 > article >正文

浅聊Java反射

Java 的反射Reflection机制是 Java 语言中最强大、但也最容易让初学者感到迷惑的特性之一。如果用一句话概括反射它允许程序在运行期间Runtime像照镜子一样动态地获取任意一个类的内部结构包括属性、方法、构造器并且能够动态地操作这些属性和方法。为了让你由浅入深地理解我们分为四个阶段来拆解概念认知 - 获取“镜子” - 核心操作 - 底层意义。第一阶段为什么要用反射打破常规在正常情况下我们写代码是“正向”的。也就是先知道有什么类然后去new它调用它的方法。Java// 正向操作编译期就已经确定了 User user new User(); user.setName(张三); user.sayHello();但假设有一天你正在写一个框架比如 Spring。你不知道未来使用这个框架的程序员会写什么类你只知道他们会在一个配置文件比如 XML 文件里写下一串字符串classcom.example.User。这时候你没法在代码里写new User()因为你写框架的时候User类根本不存在反射就是为了解决这种“在运行时才确定要操作什么类”的问题。它赋予了 Java 极大的动态性。第二阶段拿到类的“解剖图” —— Class 对象在 Java 中万物皆对象。连“类”本身也是一种对象这种对象叫做Class对象。你想反射操作一个类第一步必须先拿到它的Class对象也就是它的解剖图。拿到Class对象有三种常见方式Java// 假设有一个现成的 User 类 // 方式一通过类名最常用适合硬编码 Class? clazz1 User.class; // 方式二通过实例对象知道对象想看看它属于什么类 User user new User(); Class? clazz2 user.getClass(); // 方式三通过类的全限定名字符串最动态框架最爱适合读取配置文件 Class? clazz3 Class.forName(com.example.User);拿到clazz之后你就可以对User类进行“解剖”了。第三阶段核心操作演练用代码说话为了演示我们先准备一个普通的User类注意里面有一些私有private的属性和方法。Javapublic class User { private String name; // 私有属性 public int age; // 无参构造 public User() { } // 带参构造 public User(String name, int age) { this.name name; this.age age; } // 私有方法 private void secretMethod() { System.out.println(name 的秘密方法被调用了); } // 公开方法 public void publicMethod() { System.out.println(大家好我是 name); } }接下来我们全程用反射来操作它就像黑客一样绕过常规限制。1. 动态创建对象不使用new关键字用反射实例化对象。JavaClass? clazz Class.forName(com.example.User); // 1. 调用无参构造创建对象 Object obj1 clazz.getDeclaredConstructor().newInstance(); // 2. 调用带参构造创建对象 Object obj2 clazz.getDeclaredConstructor(String.class, int.class) .newInstance(李四, 25);2. 暴力篡改私有属性反射的霸道之处正常情况下外界是无法修改private属性的但反射可以。JavaObject userObj clazz.getDeclaredConstructor().newInstance(); // 获取名为 name 的私有属性 Field nameField clazz.getDeclaredField(name); // 【核心魔术】打破封装允许访问私有成员 nameField.setAccessible(true); // 将 userObj 这个对象的 name 属性设置为 王五 nameField.set(userObj, 王五); // 验证一下 System.out.println(nameField.get(userObj)); // 输出: 王五3. 动态调用私有方法同样私有方法也能被强行调用。Java// 获取名为 secretMethod 的私有方法没有参数 Method secretMethod clazz.getDeclaredMethod(secretMethod); // 打破封装 secretMethod.setAccessible(true); // 执行 userObj 这个对象上的 secretMethod 方法 secretMethod.invoke(userObj); // 输出: 王五 的秘密方法被调用了第四阶段由深入浅看反射它的优缺点与应用场景看完了上面的代码你可能会觉得“这不仅麻烦破坏了面向对象的封装性private形同虚设而且每次都要抛出一大堆异常ClassNotFoundException,IllegalAccessException等。”为什么要用这么“危险”的东西应用场景无处不在的反射日常写业务代码增删改查你几乎永远用不到反射。但是一旦你开始接触或者编写底层框架反射就是灵魂Spring 框架 (IoC/DI)Spring 怎么知道给你注入哪个对象它就是通过读取 XML 或注解如Service,Autowired获取全类名然后通过反射Class.forName().newInstance()帮你把对象 new 出来并放进容器里的。JDBC 数据库连接Class.forName(com.mysql.cj.jdbc.Driver);这就是典型的反射加载驱动。MyBatis你只写了接口Mapper没有写实现类为什么能查数据库因为 MyBatis 在底层用反射和动态代理帮你动态生成了实现类。各种 JSON 序列化库如 Gson, FastJson它们怎么知道把你传进去的 JSON 字符串转成什么对象的也是通过反射读取对象的字段去赋值的。反射的“代价”性能开销反射是一种“解释性”操作Java 虚拟机无法对这类代码进行早期的性能优化。因此反射操作通常比直接的 Java 代码慢得多。不过在现代 JVM 中这种性能损耗在绝大多数常规业务场景下可以忽略不计。破坏安全性由于可以强制访问私有变量和方法可能会导致不可预知的副作用破坏了类的内部逻辑约束。总结一下反射就像是 Java 提供给开发者的一把“万能钥匙”和“X光机”。业务开发时把钥匙收好遵守面向对象规则框架开发时拿出钥匙追求极致的灵活性和解耦。

相关文章:

浅聊Java反射

Java 的反射(Reflection)机制是 Java 语言中最强大、但也最容易让初学者感到迷惑的特性之一。如果用一句话概括反射:它允许程序在运行期间(Runtime),像照镜子一样,动态地获取任意一个类的内部结…...

【ElevenLabs地铁语音实战指南】:0代码接入、3步定制多语言报站,已验证上线北京/深圳12条线路

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs地铁站播报语音 ElevenLabs 提供的高保真语音合成 API,正被广泛应用于城市轨道交通的智能广播系统中。其多语言、低延迟、情感可调的 TTS(Text-to-Speech)…...

【Midjourney Dirt印相终极指南】:从0到1复刻暗房胶片肌理,3步生成高质感复古影像

更多请点击: https://intelliparadigm.com 第一章:Midjourney Dirt印相的本质与历史溯源 Dirt印相(Dirt Photogram)并非Midjourney原生术语,而是社区对一类特定视觉风格的戏称——指在图像生成中刻意引入颗粒噪点、胶…...

2026 AI模型API聚合站真实测评:四大主流平台深度剖析,为企业选型提供精准指南

随着AI技术的大规模应用,AI模型API聚合站成为了企业快速接入先进智能能力、降低技术门槛的关键工具。目前市场上的服务商质量参差不齐,企业在选择时往往需要考虑稳定性、合规性和接入成本等多个因素。为了解决这一难题,本文对当前主流的四大A…...

【实战指南】利用VCS-XA与Verdi实现高效数模混合仿真

1. 数模混合仿真入门指南 第一次接触数模混合仿真的工程师,往往会被各种专业术语和复杂流程搞得晕头转向。我刚开始做混合信号芯片验证时,就曾经对着SPICE网表和Verilog代码发愁——数字信号怎么和模拟波形交互?仿真结果怎么看?调…...

保姆级教程:从显微镜下的芯片照片到完整版图,手把手教你图像拼接与对准

芯片显微图像处理实战:从碎片化照片到完整版图的逆向工程指南 当你面对数百张杂乱无章的芯片显微照片时,是否感到无从下手?这些看似孤立的图像碎片,实际上隐藏着芯片设计的完整密码。本文将带你走进电子显微镜下的微观世界&#x…...

飞书文档批量导出神器:跨平台自动化迁移解决方案

飞书文档批量导出神器:跨平台自动化迁移解决方案 【免费下载链接】feishu-doc-export 飞书文档导出服务 项目地址: https://gitcode.com/gh_mirrors/fe/feishu-doc-export 在数字化办公时代,企业文档管理面临着从云平台迁移到本地存储的普遍需求。…...

点云配准算法进化史:从ICP的‘硬匹配’到CT-ICP的‘连续时空’,理解GICP背后的概率模型

点云配准算法进化史:从ICP的刚性匹配到CT-ICP的时空连续性 在三维感知技术领域,点云配准算法的发展犹如一部浓缩的技术进化史。从早期简单的几何匹配到如今融合概率模型与时空连续性的复杂系统,每一次算法迭代都对应着实际应用场景中亟待解决…...

电脑公司的维修系统|基于java和小程序的电脑公司的维修平台设计与实现(源码+数据库+文档)

电脑公司的维修平台 目录 基于java和小程序的电脑公司的维修平台设计与实现 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农|毕设布道师…...

深蓝词库转换:打破输入法数据孤岛的终极解决方案

深蓝词库转换:打破输入法数据孤岛的终极解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾因更换设备或操作系统而面临输入法词库无法迁移…...

《计算机系统应用》期刊投稿经验分享

本人由于第一次投稿计算机系统应用,没有相关经验,所以总结了一下投稿的时间线,希望能帮到以后的投稿人。 期刊名:《计算机系统应用》 投稿时间:2026年6月14日-2022年7月20日 投稿流程:时间状态备注2026年03…...

Python 爬虫进阶技巧:多进程爬虫突破单线程性能瓶颈

前言 在 Python 爬虫开发中,普通多线程受GIL 全局解释器锁限制,仅能在 IO 密集型场景实现并发提速,一旦爬虫逻辑中夹杂页面大量解析、数据清洗、格式转换、批量入库等 CPU 计算密集型任务,多线程会出现性能天花板,无法…...

GBase 8s 之 dbschema 导出数据库对象定义介绍

在数据库管理和开发过程中,经常需要导出数据库对象的定义,以便进行备份、迁移或分析。GBase 8s 提供了 dbschema 工具,能够方便地导出各种数据库对象的定义。本文将详细介绍 dbschema 的使用方法,帮助你快速掌握这一实用工具。…...

GBase 8a之替换字符串中中文的方法

主要解决问题字符串中存在中文,将中文识别出来,并替换为想要的字符串。实现原理(1)用REGEXP_REPLACE函数,将字符串里的中文字符替换为所需要的字符串。(2)正则表达式[\u4e00-\u9fa5]用于匹配中文…...

【GVA】商业级综合后台的整体技术生态和功能拼图

GVA(Gin-Vue-Admin)正是一个完美的“全家桶教科书”。我们来了解一下这个综合后台里最核心的 8 大技术拼图。让我们一起去摸清这些组件的职责一、 综合后台的 8 大硬核技术拼图1. 配置管理中心 —— Viper“你们项目的配置文件(MySQL、Redis …...

ARM架构ELR_EL2寄存器原理与应用详解

1. ARM架构异常处理机制概述在ARMv8/ARMv9架构中,异常处理是实现系统可靠性和安全性的核心机制。每当处理器遇到中断、陷阱或故障时,就会暂停当前执行流,转而执行预先定义的异常处理程序。这种机制不仅用于处理硬件错误,更是实现操…...

ARM架构定时器系统原理与优化实践

1. ARM架构定时器系统深度解析在嵌入式系统和实时操作系统中,精确的时间控制是系统可靠性的基石。ARM架构提供了一套完整的定时器硬件机制,通过系统寄存器实现对时间管理的精细化控制。这些定时器不仅用于基础的计时功能,更是任务调度、性能分…...

高性能鼠标跟随动画实现:从基础原理到mouse-follower库实战

1. 项目概述:一个丝滑的鼠标跟随器最近在重构一个个人作品集网站,想在交互细节上增加一些趣味性和现代感。一个常见的想法是:让鼠标光标不再是那个单调的箭头或小手,而是变成一个自定义的、带有动效的图形,并且这个图形…...

串口数据监控软件开发总结

1.飞控发送太快,串口传输太慢,导致大量数据包粘包,残包,丢失 本次针对串口数据解析,就使用了一个1k的buf作为缓冲,用递归函数解包,打包。线程只做读取,单独开子线程处理数据。 2套半…...

CircuitPython REPL与库管理:嵌入式开发交互调试与项目部署实战

1. CircuitPython REPL:嵌入式开发的交互式利器在嵌入式开发的世界里,传统的“编写-编译-烧录-调试”循环常常令人望而生畏,尤其是当你只是想快速验证一个传感器读数,或者测试某个引脚的电平状态时。CircuitPython 带来的 REPL 环…...

CircuitPython硬件编程入门:从GPIO控制到I2C传感器应用

1. 项目概述:从Python到硬件的桥梁如果你和我一样,是从软件世界一脚踏进硬件领域的,那你肯定也经历过那种面对一堆引脚、电阻和传感器时的茫然。几年前,当我第一次尝试让一个LED灯闪烁时,我发现自己被困在了复杂的C语言…...

LinkSwift:高效解锁八大网盘直链下载的完整实用指南

LinkSwift:高效解锁八大网盘直链下载的完整实用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云…...

基于DNS的TEE认证革新:原理、实现与性能优化

1. 项目概述:基于DNS的TEE认证革新在云计算安全领域,可信执行环境(TEE)技术正经历着从专用场景向通用基础设施的演进。传统TEE认证方案如RA-TLS存在两个根本性缺陷:一是依赖客户端主动验证硬件证明,导致非T…...

Adafruit IO与WipperSnapper:无代码物联网开发实战指南

1. 项目概述与核心价值 如果你正在寻找一种能快速将硬件原型转化为可远程监控和控制的物联网设备的方法,那么Adafruit IO与WipperSnapper的组合绝对值得你花时间深入了解。这套方案的核心魅力在于,它几乎移除了传统物联网开发中最繁琐的环节——固件编程…...

AI时代的“新铁饭碗”:那些机器越强、人越贵的岗位

——写给软件测试从业者的未来指南当AI能够在90秒内完成一份测试报告的初稿,当大语言模型可以自动生成覆盖边界值的测试用例,许多软件测试从业者内心都升起过一丝隐忧:我们会被取代吗?这种焦虑并非空穴来风。2025年的行业数据显示…...

第十一篇:《性能压测基础:JMeter线程模型与压测策略设计》

完成了接口功能测试后,我们将正式进入性能压测领域。性能压测的核心是模拟真实用户并发访问,评估系统在不同负载下的响应能力。本文将从 JMeter 的线程模型出发,讲解如何设计合理的压测策略(基准测试、负载测试、稳定性测试&#…...

对比直接使用原厂API体验Taotoken在批量任务中的稳定性与成本优势

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比直接使用原厂API体验Taotoken在批量任务中的稳定性与成本优势 在需要高频调用大模型API的自动化内容生成项目中,开…...

标注数据集保姆级教程:从入门到排名第一,看这一篇就够了

一、常见坑与避雷第一,过度依赖众包导致标签质量参差不齐。企业往往以价格为先,忽视了众包工人对领域术语的理解深度,从而造成模型召回率下降7%。第二,缺乏统一标注工具链。使用Excel、Word等异构工具会让数据格式碎片化&#xff…...

轻量级Web数据采集框架harvest:模块化设计与异步爬虫实践

1. 项目概述:一个轻量级、可扩展的Web数据采集框架最近在做一个需要从多个网站定期抓取数据的小项目,一开始想用现成的爬虫框架,但发现要么太重,要么定制起来太麻烦。后来在GitHub上翻到了一个叫tfukaza/harvest的项目&#xff0c…...

从SNAP到ENVI:手把手教你处理哨兵2A数据并计算6种植被指数(附完整代码)

从SNAP到ENVI:哨兵2A数据处理与六种植被指数全流程实战指南 在遥感生态监测领域,哨兵2A数据因其10-60米的空间分辨率和13个光谱波段的丰富信息,已成为植被动态研究的重要数据源。然而从原始数据到可用指标,需要经历复杂的预处理和…...