java反射

在 Java 中,反射(Reflection) 是一种允许程序在运行时检查、修改类/对象内部信息,并动态调用方法的机制。它的核心思想是通过运行时分析类结构,突破静态编译的限制,实现高度灵活的操作。


核心功能

  1. 运行时获取类信息
    动态获取类的名称、父类、接口、字段(Field)、方法(Method)、构造方法(Constructor)等元数据。

  2. 动态操作对象

    • 创建对象实例(即使构造函数是 private)
    • 读写字段值(即使字段是私有)
    • 调用方法(包括私有方法)
  3. 突破访问限制
    通过 setAccessible(true) 方法,可以绕过 privateprotected 等访问修饰符的限制。


关键类和接口

类/接口作用
java.lang.Class表示类的元数据(如类名、方法、字段等)
java.lang.reflect.Method表示类的方法,可用于动态调用
java.lang.reflect.Field表示类的字段,支持读取或修改值
java.lang.reflect.Constructor表示类的构造方法,用于创建对象

使用步骤示例

 
// 1. 获取类的 Class 对象 Class<?> clazz = Class.forName("com.example.User"); // 2. 创建实例(通过无参构造方法) Object user = clazz.newInstance(); // 3. 获取方法并调用 Method setNameMethod = clazz.getMethod("setName", String.class); setNameMethod.invoke(user, "Alice"); // 相当于调用 user.setName("Alice"); // 4. 访问私有字段并修改值 Field ageField = clazz.getDeclaredField("age"); ageField.setAccessible(true); // 绕过访问检查 ageField.set(user, 30); // 直接设置私有字段的值 

核心应用场景

  1. 框架开发
    如 Spring 框架通过反射实现依赖注入(@Autowired)、动态代理(AOP)等。
  2. 单元测试
    JUnit 通过反射找到带有 @Test 注解的方法并执行。
  3. 序列化工具
    Jackson/GSON 解析 JSON 时,通过反射获取类的字段信息。
  4. 动态扩展
    插件化系统动态加载类(如通过 Class.forName())。

反射的优缺点

优点

  • 极大提高代码灵活性(如根据配置文件动态调用类)。
  • 适合开发通用框架和工具。

缺点

  • 性能开销大:反射操作比直接调用慢约 10~100 倍(JVM 优化受限)。
  • 安全问题:可能破坏封装性,访问私有成员。
  • 代码可读性差:反射代码较复杂,不易调试。

使用建议

  • 谨慎使用:仅在需要动态性(如框架设计)时使用反射。
  • 缓存结果:避免重复获取 MethodField 对象(通过 Map 缓存)。
  • 替代方案:优先考虑接口、设计模式(如工厂模式)等更安全的动态机制。

使用反射时,务必注意代码的性能和安全风险!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27480.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示

wordpress插件介绍 “WP高级摘要插件”功能丰富&#xff0c;它允许用户在WordPress后台自定义文章摘要。 可设置摘要长度&#xff0c;灵活调整展示字数&#xff1b;设定摘要最后的显示字符&#xff0c; 如常用的省略号等以提示内容未完整展示&#xff1b;指定允许在摘要中显示…

健康医疗大数据——医疗影像

一、 项目概述 1.1 项目概述 1.2 项目框架 1.3 项目环境 1.4 项目需求 二、项目调试与运行 2.1需求分析 2.2具体实现 三、项目总结 项目概述 项目概述 本项目旨在应用大数据技术于医疗影像领域&#xff0c;通过实训培养团队成员对医疗大数据处理和分析的实际…

C# OnnxRuntime部署DAMO-YOLO人头检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…

VPC2-多域攻击-tomcat渗透-通达oa-域控提权-密码喷射-委派攻击-数据库提权

下载链接: https://pan.baidu.com/s/1nUYj6G9ouj6BcumDgoDaGg 提取码: ejbn jishu域 windows 2008 tomcat渗透 访问发现tomcat 点击manage app 尝试弱口令进入,发现tomcat/tomcat成功进入 用哥斯拉生成后门 然后建立一个文件夹&#xff0c;把它放进去&#xff0c;把它改名…

Linux知识-第一天

Linux的目录机构为一个树型结构 其没有盘符这个概念&#xff0c;只有一个根目录&#xff0c;所有文件均在其之下 在Linux系统中&#xff0c;路径之间的层级关系 使用 / 开头表示根目录&#xff0c;后面的表示层级关系 Linux命令入门 Linux命令基础 Linux命令通用格式 comman…

【蓝桥杯单片机】第十二届省赛

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 由Y5C控制 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器…

FPGA开发,使用Deepseek V3还是R1(7):以“FPGA的整体设计框架”为例

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

Linux进程状态

一.基础知识 在进入到Linux进程状态学习之前&#xff0c;我们先学习一些基础知识&#xff1a; 1.1并发和并行 并发&#xff1a; 在单CPU的计算机中&#xff0c;并不是把当前进程执行完毕之后再执行下一个&#xff0c;而是给每个进程都分配一个时间片&#xff0c;基于时间片进…

【含文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

项目介绍 本课程演示的是一款 基于SpringBoot电脑DIY装机教程网站的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

【免费】2000-2020年各省地区生产总值指数数据

2000-2020年各省地区生产总值指数数据 1、时间&#xff1a;2000-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区、年份、地区生产总值指数(上年100) 4、范围&#xff1a;31省 5、指标说明&#xff1a;地区生产总值指数&#xff0…

【大厂AI实践】清华:清华古典诗歌自动生成系统“九歌”的算法

【大厂AI实践】清华&#xff1a;清华古典诗歌自动生成系统“九歌”的算法 &#x1f31f; 嗨&#xff0c;你好&#xff0c;我是 青松 &#xff01; &#x1f308; 自小刺头深草里&#xff0c;而今渐觉出蓬蒿。 文章目录 **01 自动作诗缘起****1. 诗歌自动写作** **02 九歌的模型…

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…

基于eRDMA实测DeepSeek开源的3FS

DeepSeek昨天开源了3FS分布式文件系统, 通过180个存储节点提供了 6.6TiB/s的存储性能, 全面支持大模型的训练和推理的KVCache转存以及向量数据库等能力, 每个客户端节点支持40GB/s峰值吞吐用于KVCache查找. 发布后, 我们在阿里云ECS上进行了快速的复现, 并进行了性能测试, ECS…

DeepSeek掘金——DeepSeek-R1图形界面Agent指南

DeepSeek掘金——DeepSeek-R1图形界面Agent指南 本文将指导你完成设置 DeepSeek R1 和 Browser Use 的过程,以创建能够执行复杂任务的 AI 代理,包括 Web 自动化、推理和自然语言交互。 开源大型语言模型 (LLM) 的兴起使得创建可与 OpenAI 的 ChatGPT Operator 等专有解决方案…

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity&#xff1a;pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity&#xff1a;pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

Lua | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树&#xff0c;要么是满足以下特性的树 &#xff08;1&#xff09;左子树不为空&#xff0c;那么左子树左右节点的值都小于根节点的值 &#xff08;2&#xff09;右子树不为空&#xff0c;那么右子树左右节点的值都大于根节点的值 &#…

SpringBoot快速入门

快速入门 1). 创建springboot工程&#xff0c;并导入 mybatis的起步依赖、mysql的驱动包、lombok等。 项目工程创建完成后&#xff0c;自动在pom.xml文件中&#xff0c;导入Mybatis依赖和MySQL驱动依赖。如下所示&#xff1a; 2). 数据准备&#xff1a;创建用户表user&#xf…

DataWorks (数据工厂)介绍

介绍 DataWorks 是阿里云推出的一体化大数据开发与治理平台&#xff0c;曾用名"数据工厂""大数据开发套件" 最新版本是3.0 它是一套基于MaxCompute&#xff08;原ODPS&#xff09;的DW(数据仓库)解决方案&#xff0c;它集成了阿里多年的DW实施经验&…

信息技术知识赛系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装信息技术知识赛系统软件来发挥其高效地信息处理的作用&…