Java 反射机制
Java 反射(Reflection)是 Java 语言提供的一种在运行时动态获取类信息、创建对象、调用方法、访问属性等功能的机制。它允许程序在运行时对类进行检查、修改和调用,而不需要在编译时就知道类的具体信息。
一、反射的主要类和方法
-
Class类:Class类是反射的核心,它代表一个类的类型信息。可以通过以下方式获取Class对象:Object.getClass():对于一个已经存在的对象,可以通过调用getClass()方法获取其对应的Class对象。.class语法:对于已知的类名,可以直接使用.class语法获取Class对象,例如String.class。Class.forName(String className):通过类的全限定名动态加载类并获取其Class对象。
Class类的主要方法:getConstructor(Class<?>... parameterTypes):获取指定参数类型的构造方法。getDeclaredConstructor(Class<?>... parameterTypes):获取当前类声明的指定参数类型的构造方法,包括私有构造方法。getMethod(String name, Class<?>... parameterTypes):获取指定名称和参数类型的公共方法。getDeclaredMethod(String name, Class<?>... parameterTypes):获取当前类声明的指定名称和参数类型的方法,包括私有方法。getField(String name):获取指定名称的公共字段。getDeclaredField(String name):获取当前类声明的指定名称的字段,包括私有字段。newInstance():创建该类的一个新实例,调用无参构造方法。
-
Constructor类:- 代表类的构造方法。可以通过
Class类的getConstructor()或getDeclaredConstructor()方法获取Constructor对象。 - 主要方法:
newInstance(Object... initargs):使用指定的参数创建该构造方法对应的类的实例。
- 代表类的构造方法。可以通过
-
Method类:- 代表类的方法。可以通过
Class类的getMethod()或getDeclaredMethod()方法获取Method对象。 - 主要方法:
invoke(Object obj, Object... args):在指定的对象上调用该方法,并传入参数。
- 代表类的方法。可以通过
-
Field类:- 代表类的字段。可以通过
Class类的getField()或getDeclaredField()方法获取Field对象。 - 主要方法:
get(Object obj):获取指定对象上该字段的值。set(Object obj, Object value):设置指定对象上该字段的值。
- 代表类的字段。可以通过
二、反射的主要用途
动态创建对象:
可以在运行时根据类名创建对象,而不需要在编译时就知道具体的类。
例如:
try {Class<?> clazz = Class.forName("com.example.SomeClass");Object obj = clazz.newInstance();} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}
访问和修改私有成员:
反射可以突破访问限制,访问和修改类的私有构造方法、私有方法和私有字段。
例如:
try {Class<?> clazz = SomeClass.class;Constructor<?> constructor = clazz.getDeclaredConstructor();constructor.setAccessible(true);Object obj = constructor.newInstance();Field field = clazz.getDeclaredField("privateField");field.setAccessible(true);field.set(obj, newValue);Method method = clazz.getDeclaredMethod("privateMethod");method.setAccessible(true);method.invoke(obj);} catch (Exception e) {e.printStackTrace();}
-
实现依赖注入:
- 在一些框架中,反射被用于实现依赖注入。通过配置文件或注解,框架可以在运行时自动创建对象并设置其依赖关系。
- 例如,在 Spring 框架中,通过反射机制可以将一个对象的依赖自动注入到该对象中,而不需要在代码中显式地创建和设置依赖。
-
实现插件系统:
- 反射可以用于实现插件系统,允许在程序运行时动态地加载和使用插件。插件可以是独立的 JAR 文件,通过配置文件指定要加载的插件类,程序可以在运行时使用反射机制加载这些插件并调用其方法。
- 例如,一个图像编辑软件可以使用插件系统来支持不同的图像格式,用户可以在运行时安装新的插件来处理新的图像格式。
三、反射的优缺点
-
优点:
- 灵活性:反射机制使得程序可以在运行时动态地获取类信息、创建对象、调用方法、访问属性等,极大地提高了程序的灵活性。
- 可扩展性:反射机制使得程序可以在不修改源代码的情况下,通过配置文件或用户输入来扩展程序的功能。
- 通用性:反射机制可以用于任何 Java 类,无论这些类是在编译时已知还是在运行时动态加载的。
-
缺点:
- 性能开销:反射机制的使用会带来一定的性能开销。由于反射需要在运行时解析类信息、查找方法和字段等,这比直接调用方法或访问属性要慢得多。
- 安全风险:反射机制可以突破访问限制,访问和修改私有成员变量和方法。这可能会导致安全风险,特别是在不可信的环境中。
- 代码复杂性:反射机制的使用会增加代码的复杂性。由于反射需要处理各种异常和类型转换,代码可能会变得更加难以理解和维护。
总之,Java 反射是一种强大的机制,它提供了在运行时动态操作类的能力。但是,在使用反射时需要注意性能开销和安全风险,并谨慎处理异常和类型转换,以确保程序的正确性和稳定性。
相关文章:
Java 反射机制
Java 反射(Reflection)是 Java 语言提供的一种在运行时动态获取类信息、创建对象、调用方法、访问属性等功能的机制。它允许程序在运行时对类进行检查、修改和调用,而不需要在编译时就知道类的具体信息。 一、反射的主要类和方法 Class类&…...
详解MBR分区结构以及GPT分区结构
学习笔记: GUID(GPT)分区表详解_gpt分区表-CSDN博客 详解MBR分区结构以及GPT分区结构-CSDN博客 其中U盘作为移动存储设备,可不具备上述分区,也可识别...
jvm 调优篇
一 jvm调优篇 1.1 查看新生代和老年代的比例 输入命令: jinfo -flag NewRatio 17480 1.2 查看新生代,survivor和Eden区比例 1.3 查看jvm调优参数 二 调优参数 2.1 oom异常 通过visual vm查看 2.java dump 大对象 2.2 mat工具进行分析 栈的信息...
Spring AOP应用指南:概念、通知与表达式分析
目录 一.AOP的基础概念 二.Spring AOP的应用场景 三.Spring AOP的核心概念 ▐ 切点(Pointcut) ▐ 连接点(Join Point) ▐ 通知(Advice) ▐ 切面(Aspect) 通知类型 四.PointCut与Order 切面优先级 五.切点表达式 execution(...)表达式 annotation表达式 一.AOP的基…...
汽车的UDS诊断01
UDS(Unified Diagnostic Services):ISO14229中定义了汽车通用诊断协议;ISO15765规定了帧的格式; 1)UDS中的四种帧 UDS中的四种帧:单帧、首帧、流空帧、连续帧 图1 …...
MySQL——单表查询(二)按条件查询(6)DISTINCT 关键字作用于多个字段
DISTINCT 关键字可以作用于多个字段,其语法格式如下所示: SELECT DISTINCT 字段名 1,字段名 2,… FROM 表名; 在上面的语法格式中,只有 DISTINCT 关键字后指定的多个字段值都相同,才会裱认作是重复记录。 例如࿰…...
python从入门到精通:数据容器
数据容器介绍 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为一个元素,可以是任意类型的数据,如字符串、数字、布尔等。 数据容器根据特点的不同,如: 是否支持重复元素 是否可以修改 是否有序࿰…...
Java 中都有哪些引用类型?
Java 中都有哪些引用类型? 强引用 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的。因此强引…...
使用 Dify 和 AI 大模型理解视频内容:Qwen 2 VL 72B
接下来的几篇相关的文章,聊聊使用 Dify 和 AI 大模型理解视频内容。 本篇作为第一篇内容,以昨天出圈的“黑神话悟空制作人采访视频”为例,先来聊聊经常被国外厂商拿来对比的国产模型:千问系列,以及它的内测版。 写在…...
mybatisplus 通过xml 定义接口
在 MyBatis-Plus 中,虽然它极大地简化了 CRUD 操作,提供了许多注解方式(如 Select、Insert、Update、Delete)来直接在 Mapper 接口上定义 SQL 语句,但 MyBatis-Plus 仍然支持传统的 MyBatis 风格的 XML 配置方式来定义…...
上周稼先社区的活动
参天是什么? 最近”参天”很火,不仅MySQL社区,听说Monty最近也跟他们搞了很多活动。其实说起华为的数据库,只有从事数据库行业的人才知道高斯,其他很多人不知道。但是即使从事数据库相关的人,对另外一个产…...
day_45
115. 不同的子序列 class Solution:def numDistinct(self, s: str, t: str) -> int:dp [[0] * (len(t) 1) for _ in range(len(s) 1)]for i in range(len(s)):dp[i][0] 1for j in range(1, len(t)):dp[0][j] 0for i in range(1, len(s) 1):for j in range(1, len(t) …...
SQL 时间盲注 (injection 第十六关)
简介 SQL注入(SQL Injection)是一种常见的网络攻击方式,通过向SQL查询中插入恶意的SQL代码,攻击者可以操控数据库,SQL注入是一种代码注入攻击,其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…...
nginx核心配置示例
1.核心配置示例 基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机,依赖于核心模块 ngx_http_core_module实现。 1.新建一个 PC web 站点 # 访问测试 [rootnode100 ~]# curl www.root.org # 注意在访问主机中设解析 2.root 与 alias root :指…...
【面向对象】04面向对象三大特征之——继承
文章目录 一、super1.构造方法2.属性3.方法 二、规则三、继承权限 继承 继承是Java中实现代码重用的重要手段之一。使用继承,可以减少代码量,方便修改代码。Java中只支持单根继承,即一个类只能有一个直接父类。 继承使用关键字extends&#…...
计算机毕业设计Python+Flask弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 人工智能 NLP文本分类 数据可视化 大数据毕业设计
### 开题报告:基于Python和Flask的弹幕情感分析系统 #### 一、研究背景 弹幕(Danmaku)是一种实时在视频播放过程中显示的评论或弹幕,起初源于日本,但在中国的二次元文化和直播平台中得到了广泛应用。弹幕作为一种独特…...
用基础项目来理解spring的作用
简介 spring官方的解释过于专业化,初学者可能比较难懂,接下来我将通过一个最基础的Java项目来尽可能的展示spring中的作用及spring的底层是如何来实现的。 项目结构 该项目是一个简单的JavaSE项目,没有maven或者tomcat等其他。只在控制台进…...
Json-复杂泛型解析工具类
为了处理复杂的 JSON 泛型解析任务,你可以创建一个通用的工具类来封装这些操作。这里分别 针对 Jackson 和 Fastjson 提供两个工具类的例子。 1. Jackson 的 JSON 泛型解析工具类 import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackso…...
CLIP-VIT-L + Qwen 多模态学习笔记 -3
多模态学习笔记 - 3 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 吐槽 今天接着昨天的源码继续看,黑神话:悟空正好今天发售,希望广大coder能玩的开心~ 学习心得 前情提要 详情请看多模态学习笔记 - 2 上次我们讲到利用view(…...
如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎
原文:如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎 - 孔乙己大叔 (rebootvip.com) 在当今高度竞争的互联网环境中,搜索引擎优化(SEO)对于网站的可见性和成功至关重要。网站地图(Sitemap)ÿ…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
