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

Java 反射(Reflection)技术

反射是 Java 提供的一种强大机制,允许程序在运行时(Runtime)动态地获取类的信息、操作类的属性和方法。这种能力使得 Java 程序可以突破编译时的限制,实现更灵活的设计。

一、反射的核心概念

1. 什么是反射

反射是指在程序运行时动态地:

  • 获取类的完整结构(类名、方法、属性、构造器等)

  • 创建对象

  • 调用方法

  • 访问/修改字段值

2. 反射的核心类

  • Class:代表类的实体

  • Field:代表类的成员变量

  • Method:代表类的方法

  • Constructor:代表类的构造方法

二、反射的基本使用

1. 获取Class对象的三种方式

// 1. 通过类名.class
Class<?> clazz1 = String.class;// 2. 通过对象.getClass()
String str = "Hello";
Class<?> clazz2 = str.getClass();// 3. 通过Class.forName()(最常用)
Class<?> clazz3 = Class.forName("java.lang.String");

2. 创建对象

Class<?> clazz = Class.forName("com.example.User");
// 使用无参构造
Object obj1 = clazz.newInstance(); // 已过时,推荐使用下面的方式
Object obj2 = clazz.getDeclaredConstructor().newInstance();// 使用有参构造
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj3 = constructor.newInstance("张三", 25);

3. 调用方法

Class<?> clazz = Class.forName("com.example.Calculator");
Object calculator = clazz.newInstance();// 获取方法
Method addMethod = clazz.getMethod("add", int.class, int.class);// 调用方法
Object result = addMethod.invoke(calculator, 10, 20);
System.out.println("结果: " + result); // 输出: 结果: 30

4. 访问字段

Class<?> clazz = Class.forName("com.example.Person");
Object person = clazz.newInstance();// 获取字段(包括私有字段)
Field nameField = clazz.getDeclaredField("name");// 设置可访问(即使是private字段)
nameField.setAccessible(true);// 设置字段值
nameField.set(person, "李四");// 获取字段值
String name = (String) nameField.get(person);
System.out.println(name); // 输出: 李四

三、反射的应用场景

  1. 框架设计:Spring、Hibernate等框架大量使用反射

    • Spring的IoC容器通过反射创建和管理Bean

    • Hibernate通过反射实现ORM映射

  2. 动态代理:AOP编程的基础

  3. 注解处理:运行时通过反射读取注解信息

  4. 工具类开发:如通用的对象属性拷贝工具

  5. IDE功能:代码提示、自动补全等功能使用反射获取类信息

四、反射的优缺点

优点:

  • 灵活性高:可以在运行时动态操作类和对象

  • 扩展性强:可以实现通用框架和组件

  • 突破访问限制:可以访问私有成员

缺点:

  • 性能开销:反射操作比直接调用慢

  • 安全问题:可以绕过访问权限检查

  • 代码复杂度:反射代码可读性较差

  • 破坏封装性:可以访问私有成员,破坏面向对象特性

五、性能优化建议

  1. 缓存Class对象:避免重复获取

  2. 缓存Method/Field对象:避免重复查找

  3. setAccessible(true)只调用一次

  4. 考虑使用MethodHandle(Java7+)

六、反射与泛型

通过反射可以绕过泛型检查:

List<String> list = new ArrayList<>();
list.add("hello");Class<?> clazz = list.getClass();
Method addMethod = clazz.getMethod("add", Object.class);
addMethod.invoke(list, 100); // 添加非String类型System.out.println(list); // 输出: [hello, 100]

反射是Java高级特性中的重要部分,合理使用可以极大增强程序的灵活性,但也要注意其带来的性能和安全问题。

相关文章:

Java 反射(Reflection)技术

反射是 Java 提供的一种强大机制&#xff0c;允许程序在运行时&#xff08;Runtime&#xff09;动态地获取类的信息、操作类的属性和方法。这种能力使得 Java 程序可以突破编译时的限制&#xff0c;实现更灵活的设计。 一、反射的核心概念 1. 什么是反射 反射是指在程序运行…...

【SpringBoot】从零开始全面解析SpringMVC (三)

本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. &#x1f40e;文章专栏: JavaEE进阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,…...

DeerFlow安装配置及使用案例

DeerFlow安装配置及使用案例 简介 ​ DeerFlow项目由字节跳动技术团队发起和主导开发&#xff0c;作为一个开源深度研究框架&#xff0c;于2025年年初正式开源。该项目基于LangStack生态&#xff0c;构建于LangChain与LangGraph的开源技术栈之上&#xff0c;充分利用语言模型…...

吉林省建筑工程专业技术人员职称评审实施办法

吉林省人力资源和社会保障厅 吉林省建筑工程专业技术人员职称评审实施办法 吉林省建筑工程技术人才之技术员评审条件 吉林省建筑工程技术人才之助理工程师评审条件 吉林省建筑工程技术人才之工程师评审条件 吉林省建筑工程技术人才之高级工程师评审条件 吉林省建筑工程技术人才…...

React组件开发流程-03.1

此章先以一个完整的例子来全面了解下React组件开发的流程&#xff0c;主要是以代码为主&#xff0c;在不同的章节中会把重点标出来&#xff0c;要完成的例子如下&#xff0c;也可从官网中找到。 React组件开发流程 这只是一个通用流程&#xff0c;在熟悉后不需要完全遵从。 …...

Vue 中 v-model 的三种使用方式对比与实践

在 Vue 3 中&#xff0c;v-model 是组件双向数据绑定的核心特性。随着 Vue 的版本演进&#xff0c;v-model 的使用方式也在不断优化。本文将基于您提供的代码示例&#xff0c;详细分析三种不同的 v-model 实现方式&#xff1a;基础用法、useVModel Hook&#xff08;vueuse/core…...

Adminer:一个基于Web的轻量级数据库管理工具

Adminer 是一个由单个 PHP 文件实现的免费数据库管理工具&#xff0c;支持 MySQL、MariaDB、PostgreSQL、CockroachDB、SQLite、SQL Server、Oracle、Elasticsearch、SimpleDB、MongoDB、Firebird、Clickhouse 等数据库。 Adminer 支持的主要功能如下&#xff1a; 连接数据库服…...

Linux笔记---内核态与用户态

用户态&#xff08;User Mode&#xff09; 权限级别&#xff1a;较低&#xff0c;限制应用程序直接访问硬件或关键系统资源。 适用场景&#xff1a;普通应用程序的运行环境。 限制&#xff1a;无法执行特权指令&#xff08;如操作I/O端口、修改内存管理单元配置等&#xff09…...

MFC 编程中 OnInitDialog 函数

核心作用 对话框初始化入口 &#xff1a;创建完成后第一个执行的函数。是对话框的起点。控件操作安全期 &#xff1a;此时所有控件已创建完成。可以安全地进行控件的初始化、属性设置等操作。界面布局最佳时机 &#xff1a;窗口显示前完成初始化设置。可以进行布局调整、数据初…...

Java高频面试之并发编程-18

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说synchronized synchronized 是 Java 中实现线程同步的核心关键字&#xff0c;用于解决多线程环境下的资源竞争…...

深入探究AKS Workload Identity

Azure Kubernetes 服务 (AKS) 提供了一项名为 Workload Identity 的强大功能&#xff0c;它可以增强安全性并简化在 Kubernetes 集群中运行的应用程序的身份验证。以下是 Workload Identity 在 AKS 环境中的工作原理概述&#xff1a; AKS 中的 Workload Identity 允许 Pod 无需…...

【MySQL基础】MySQL基础:MySQL基本操作与架构

MySQL学习&#xff1a; https://blog.csdn.net/2301_80220607/category_12971838.html?spm1001.2014.3001.5482 前言&#xff1a; 这里是MySQL学习的第一篇&#xff0c;本篇主要是讲解一些MySQL的基础操作&#xff0c;但这并不是重点&#xff0c;本篇我们主要是要理解MySQL…...

【线下沙龙】NineData x Apache Doris x 阿里云联合举办数据库技术Meetup,5月24日深圳见!

5月24日下午&#xff0c;NineData 将联合 Apache Doris、阿里云一起&#xff0c;在深圳举办数据库技术Meetup。本次技术沙龙聚焦「数据实时分析」与「数据同步迁移」 两大核心领域&#xff0c;针对企业数据战略中的痛点&#xff0c;特邀行业资深技术大咖&#xff0c;结合多年技…...

【Unity网络编程知识】Unity的 UnityWebRequest相关类学习

1、UnityWebRequest类介绍 UnityWebRequest是一个unity提供的一个模块化的系统类&#xff0c;用于构成HTTP请求和处理HTTP响应&#xff0c;它主要目标是让unity游戏和Web服务端进行交互&#xff0c;它将之前WWW的相关功能都集成在了其中&#xff0c;所以新版本中都建议使用unit…...

STM32实战指南——DHT11温湿度传感器驱动开发与避坑指南

知识点1【DHT11的概述】 1、概述 DHT是一款温湿度一体化的数字传感器&#xff08;无需AD转换&#xff09;。 2、驱动方式 通过单片机等微处理器简单的电路连接就能实时采集本地湿度和温度。DHT11与单片机之间采用单总线进行通信&#xff0c;仅需要一个IO口。 相对于单片机…...

SVG 与 Canvas 技术调研对比

在 画布 中进行 大量矩形框绘制 时&#xff0c;SVG 和 Canvas 都是可行的技术方案&#xff0c;但它们适用于不同的场景&#xff0c;技术特性也有明显区别。下面我从性能、灵活性、可维护性、适用场景等方面做一个系统性的对比&#xff0c;帮助你做出更合适的选择。 &#x1f9e…...

Ubuntu 远程桌面配置指南

概述: 本文主要介绍在Ubuntu 22.04中通过VNC实现远程连接的方法。首先需安装图形化界面和VNC工具x11vnc,设置开机启动服务;然后在Windows客户端用VNC Viewer通过局域网IP和端口5900连接。 总结: 一、VNC配置与安装 安装图形化界面 在Ubuntu 22.04中需先安装: sudo apt …...

146. LRU 缓存

一、题目 二、思路 题目要求 O(1) 的平均时间复杂度运行 -> 使用Map空间换时间 Map<Integer, Node>Map 通过 key 直接找到对应节点 getNode(key) -> Node记得只要查过该节点之后就应该把该节点放到最前面 pushFront(Node)put 元素后&#xff0c;在map中添加&…...

微信学习之导航功能

先看这个功能的效果&#xff1a; 然后开始学习吧。 一、我们这里用的是vant的Grid控件&#xff0c;首先我们导入&#xff1a; { "usingComponents": {"van-search": "vant/weapp/search/index","my-swiper":"../../components…...

MySQL替换瀚高数据库报错: TO_DAYS()不存在(APP)

文章目录 环境症状问题原因解决方案报错编码 环境 系统平台&#xff1a;中标麒麟&#xff08;海光&#xff09;7,中标麒麟&#xff08;飞腾&#xff09;7 版本&#xff1a;4.5 症状 MySQL替换为瀚高数据库进行应用系统适配报错&#xff1a;TO_DAYS&#xff08;&#xff09;不…...

FPGA:高速接口JESD204B以及FPGA实现

本文将先介绍JESD204B高速接口的基本概念和特性&#xff0c;然后详细说明如何基于Xilinx Kintex-7系列FPGA实现JESD204B高速接口。 一、JESD204B高速接口介绍 JESD204B是由JEDEC&#xff08;固态技术协会&#xff09;制定的一种高速串行通信标准&#xff0c;主要用于数据转换器…...

HarmonyOS Navigation组件深度解析与应用实践

HarmonyOS Navigation组件深度解析与应用实践 一、组件架构与核心能力 HarmonyOS Navigation组件作为路由导航的根视图容器&#xff0c;采用三层架构设计&#xff1a; 标题层&#xff1a;支持主副标题配置&#xff0c;提供Mini/Free/Full三种显示模式内容层&#xff1a;默认…...

C#中的ThreadStart委托

ThreadStart 委托&#xff1a; ThreadStart 是 .NET 中的一个内置委托类型&#xff0c;表示无参数且无返回值的方法。其定义如下&#xff1a; public delegate void ThreadStart(); 通常用于定义线程的入口方法。 List<ThreadStart>&#xff1a; 这是一个泛型集合&…...

Spring boot 集成 Knife4j

knife4j官网&#xff1a;https://doc.xiaominfo.com/docs/quick-start 1. 引入Knife4j相关依赖 <!-- knife4j--> <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version…...

基于Java在高德地图面查询检索中使用WGS84坐标的一种方法-以某商场的POI数据检索为例

前言 随着移动互联网的飞速发展&#xff0c;基于位置的服务&#xff08;LBS&#xff09;需求日益增长&#xff0c;越来越多的应用需要从地图中检索特定区域内的地理信息&#xff0c;例如商业场所、公共服务设施等。商场作为城市商业活动的重要载体&#xff0c;其周边的地理信息…...

6K型护套连接器DLJ0601(2000)-00

6K型护套连接器DLJ0601(2000)-00简介 6K型护套连接器DLJ0601(2000)-00是一种用于电气连接的组件&#xff0c;广泛应用于工业设备、通信系统和电子设备中。该连接器设计紧凑&#xff0c;具有高可靠性和耐用性&#xff0c;适用于多种环境条件下的电气连接需求。 主要特点 高可…...

Hexo的Next主题的Config文件内方便修改的参数(Chat-Gpt)

这是对 Hexo 的 Next 主题 _config.yml 文件各部分配置项的中文解释&#xff0c;帮助你更方便地进行定制&#xff1a; &#x1f680; 核心设置 cache / minify cache.enable: 启用缓存&#xff0c;加快生成速度。minify: 是否压缩生成的 HTML/CSS/JS。 custom_file_path 自…...

【three】给立方体的每个面加载不同贴图

效果图&#xff1a; 主要代码&#xff1a; initCube() {let _this thisconst geometry new Three.BoxGeometry(1, .3, .5)let TextureLoader new Three.TextureLoader()let mater1TextureLoader.load(require(/assets/images/bg2.jpg),function (texture){console.log(tex…...

vscode怎么关闭自动定位文件

关闭自动定位文件功能 方式1 在设置中搜索: explorer.autoReveal 方式2 直接在settings.json中增加"explorer.autoReveal": false 添加类似jetbrains IDE的文件定位功能 可以直接安装插件市场搜索niushuaibing.vs-location, 安装后会有文件定位按钮, 点击后即可…...

2025-5-19Vue3快速上手

1、toRefs和toRef 当解构一个响应式对象&#xff08;如 reactive 创建的对象&#xff09;时&#xff0c;直接解构会失去响应性&#xff0c;此时可用 toRefs或toRef 保持响应性 toRef 的核心作用是将对象的属性转换为 ref&#xff0c;保持与原属性的双向绑定&#xff0c;无论原…...

HDMI 屏幕 电脑HDMI HDMI采集卡的关系

一、HDMI接口方向性原理 普通设备的HDMI接口方向&#xff1a; 电脑的HDMI接口&#xff1a;无论是显卡还是主板上的HDMI&#xff0c;均为输出端&#xff08;信号源&#xff09;&#xff0c;只能向外发送视频信号&#xff0c;无法接收输入信号。 显示器的HDMI接口&#xff1a;均…...

JESD204 ip核使用与例程分析(二)

JESD204 ip核使用与例程分析(二) JESD204时钟方案专用差分时钟对例程分析jesd204_0_transport_layer_demapperjesd204_0_sig_chkjesd204_0_clockingjesd204_0 ip核port寄存器AXI-LITE寄存器配置jesd204_phy ip核JESD204时钟方案 图3-1所示为最通用、灵活的时钟解决方案。在图…...

如何使用VCS+XA加密verilog和spice网表

如果要交付verilog&#xff0c;但是需要对方进行VCS仿真&#xff0c;那么可以用以下方法&#xff1a; 一、基于编译指令的局部加密​ ​适用场景​&#xff1a;需精确控制加密范围&#xff08;如仅加密核心算法或敏感逻辑&#xff09;。 ​实现步骤​&#xff1a; ​代码标注…...

Grafana之Dashboard(仪表盘)

在前面的小节中介绍了Grafana中4中常用的可视化面板的使用&#xff0c;通过在面板中使用PromQL表达式&#xff0c;Grafana能够方便的将Prometheus返回的数据进行可视化展示。例如&#xff0c;在展示主机CPU使用率时&#xff0c;我们使用了如下表达式&#xff1a; 1 - (avg(ira…...

AOSP 中常见的键值对存储方式全解析(适用于系统开发与应用开发)

在 Android 系统开发&#xff08;AOSP&#xff09;中&#xff0c;键值对&#xff08;Key-Value&#xff09;存储是一种基础且广泛使用的数据持久化方式。从系统属性、用户设置&#xff0c;到应用配置&#xff0c;都依赖于这种结构的存储方式。本文将全面梳理 AOSP 中主流的键值…...

集合进阶2

Java不可变集合、Stream流与方法引用深度解析 一、不可变集合&#xff08;Immutable Collections&#xff09;进阶指南 1.1 不可变集合核心特性 防御性编程&#xff1a;防止外部修改数据&#xff08;如传递集合给第三方库时&#xff09;线程安全&#xff1a;天然支持多线程读…...

eMMC深度解析:嵌入式多媒体卡的硬件电路设计要点

一、eMMC 技术深度解析 1.定义与背景 eMMC&#xff08;Embedded Multi Media Card&#xff09;是一种专为嵌入式系统设计的非易失性存储解决方案&#xff0c;它将 NAND 闪存、主控芯片和接口协议封装在一个 BGA&#xff08;Ball Grid Array&#xff09;封装中。其核心目标是简…...

【SPIN】PROMELA语言编程入门同步机制(SPIN学习系列--4)

同步机制 PROMELA 不包含信号量、锁或监控器等常见的同步原语&#xff0c;而是通过语句的**可执行性&#xff08;executability&#xff09;**概念来建模同步机制。计算机系统的架构限制了同步机制的设计&#xff1a;本章主要介绍适用于共享内存系统的同步机制&#xff0c;第7…...

整数的个数

【描述】 给定k&#xff08;1< k < 100&#xff09;个正整数&#xff0c;其中每个数都是大于等于1&#xff0c;小于等于10的数。写程序计算给定的k个正整数中&#xff0c;1&#xff0c;5和10出现的次数。 【输入】 输入有两行&#xff1a;第一行包含一个正整数k&#xff…...

AWS EKS IP 耗尽:原因、解决方案和最佳实践

想象一下&#xff0c;您的 AWS EKS 集群在生产环境中运行顺畅&#xff0c;所有 CI/CD 管道运行正常&#xff0c;服务优雅地扩展&#xff0c;一切都像自动驾驶模式一样。——直到有一天&#xff0c;新的 Pod 无法启动。 您深入研究 kubectl get pods 命令&#xff0c;发现一堆 P…...

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例

艾默生流量计与Profibus DP主站转Modbus RTU/TCP网关通讯案例 在现代工业自动化控制系统中&#xff0c;艾默生流量计因其高精度、稳定性和易用性而备受青睐。然而&#xff0c;为了实现与不同协议设备之间的无缝通信&#xff0c;经常需要借助专业的通讯网关进行协议转换。本文将…...

Python测试单例模式

单例模式的核心思想 单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。这在需要控制资源访问&#xff08;如配置文件、数据库连接等&#xff09;时非常有用。 一个简单的示例&#xff1a; import threading import timeclass Singleton:instance Nonelock…...

Linux架构篇、第五章_06Jenkins 触发器全面解析与实战指南

Linux架构篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;jenkins触发器的介绍与使用 版本号: 1.0,0 作者: laowang 日期: 2025.05.16 适用环境:rocky9.5 文档说明 本文档为《jenkins 触发器的介绍与…...

如何快速更换电脑浏览器ip:教程与注意事项

无论是为了访问地域限制内容、保护隐私&#xff0c;还是解决网络问题&#xff0c;快速更换浏览器IP地址的需求日益增多。以下是快速更换电脑浏览器IP地址的几种常用方法及注意事项&#xff0c;结合了多种场景下的解决方案&#xff1a; 一、快速更换浏览器IP的方法 1. 代理服务…...

《黑马前端ajax+node.js+webpack+git教程》(笔记)——ajax教程(axios教程)

黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 文章目录 框架前置导学AJAX-Day01-01.AJAX入门与axios使用什么是AJAX如何使用AJAX使用axios获取数据案例axios语法尝试获取数据代…...

超级管理员租户资源初始化与授权管理设计方案

背景说明 在多租户系统中&#xff0c;资源&#xff08;如功能模块、系统菜单、服务能力等&#xff09;需按租户维度进行授权管理。超级管理员在创建新租户时&#xff0c;需要初始化该租户的资源授权信息。 两种可选方案 方案描述方案 A&#xff1a;前端传入选中的资源列表创…...

【Python训练营打卡】day30 @浙大疏锦行

DAY 30 模块和库的导入 知识点回顾&#xff1a; 1. 导入官方库的三种手段 2. 导入自定义库/模块的方式 3. 导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何…...

微前端记录

微前端 实习过程中&#xff0c;做了些微前端方向的调研&#xff0c;记录下 微前端将前端拆分为独立的可以单独运行&#xff0c;测试&#xff0c;部署的代码&#xff0c; 具有技术栈无关&#xff0c;多团队&#xff0c;多业务线协作的特点。 前端现有的页面&#xff0c;分为单页…...

词嵌入基础

一 前言 最近在学习NLP方面知识&#xff0c;在此记录一下词嵌入的技术。 二 词袋法 1.理论 就是统计一个句子或文章中&#xff0c;词语出现的次数。这方法有去重词袋法&#xff0c;无去重词袋法。 a 原理与案例 chinese_docs ["我爱自然语言处理","自然语…...

CSS之网页元素的显示与隐藏(旧土豆网遮罩案例)

网页元素的显示与隐藏。 很多网页的侧边栏都会出现广告&#xff0c;我们点击关闭时&#xff0c;广告会消失不见&#xff0c;但若重新刷新网页页面&#xff0c;则广告会重新出现。网页的广告并非是真的被删除了&#xff0c;而是被暂时的隐藏起来了。 • display • visibil…...