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

JAVA基础 - 反射

目录

一. 简介

二. java.lang.Class类

三. java.lang.reflect包

四. 创建对象

五. 调用方法

六. 调用成员变量



一. 简介

反射是 Java 语言中的一种强大机制,允许程序在运行时动态地获取类的信息、访问类的成员(包括字段、方法和构造函数)以及操作这些成员。

通过反射,您可以:

  1. 在运行时获取类的名称、父类、实现的接口等信息。

  2. 访问和修改对象的私有字段的值。

  3. 调用对象的私有方法。

  4. 在运行时创建类的实例。

反射的主要类和接口包括:

  1. Class 类:表示一个类或接口在 Java 运行时的对象。

  2. Field 类:表示类的字段。

  3. Method 类:表示类的方法。

  4. Constructor 类:表示类的构造函数。

二. java.lang.Class

java.lang.Class 类在 Java 反射机制中起着核心作用。

它用于表示正在运行的 Java 应用程序中的类和接口。通过这个类,可以获取关于类的各种信息,如类的名称、属性、方法、父类、实现的接口等。

以下是 Class 类的一些常见方法和用途:

  1. forName(String className):根据类的全限定名加载并返回对应的 Class 对象。

  2. getSimpleName():获取类的简单名称(不包含包名)。

  3. getCanonicalName():获取类的规范名称(包含包名)。

  4. getSuperclass():获取父类的 Class 对象。

  5. getInterfaces():获取实现的接口的 Class 对象数组。

  6. getDeclaredFields():获取本类声明的所有字段(包括私有字段)。

  7. getFields():获取本类及父类的所有公有字段。

  8. getDeclaredMethods():获取本类声明的所有方法(包括私有方法)。

  9. getMethods():获取本类及父类的所有公有方法。

  10. newInstance():创建类的新实例(调用无参构造函数)。

public class ClassExample {public static void main(String[] args) {try {Class<?> clazz = Class.forName("java.util.ArrayList");System.out.println("类的简单名称: " + clazz.getSimpleName());System.out.println("类的规范名称: " + clazz.getCanonicalName());Class<?> superclass = clazz.getSuperclass();System.out.println("父类: " + superclass.getCanonicalName());} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

总之,Class 类为 Java 程序在运行时动态获取和操作类的信息提供了强大的支持。

三. java.lang.reflect

java.lang.reflect 包提供了用于反射操作的类和接口,允许在运行时检查和操作类、方法、字段和构造函数等。

以下是该包中的一些重要类和接口:

  1. Field 类:表示类的字段。可以通过它获取和设置字段的值,无论字段是公有、私有还是受保护的。

  2. Method 类:代表类的方法。可以获取方法的名称、参数类型、返回类型,并能够在运行时调用方法。

  3. Constructor 类:表示类的构造函数。可用于获取构造函数的参数类型,并通过它创建类的实例。

  4. Array 类:提供了一些静态方法来操作数组。

使用反射机制虽然强大,但也存在一些潜在的问题。例如,反射可能会破坏封装性,导致代码更难以理解和维护。此外,由于反射需要在运行时进行类型检查和方法调用,可能会带来一定的性能开销。

以下是一个简单的示例,展示如何使用 java.lang.reflect 包中的类获取类的方法信息:

import java.lang.reflect.Method;public class ReflectPackageExample {public static void main(String[] args) {try {Class<?> clazz = Class.forName("YourClassName");Method[] methods = clazz.getDeclaredMethods();for (Method method : methods) {System.out.println("方法名: " + method.getName());Class<?>[] parameterTypes = method.getParameterTypes();System.out.print("参数类型: ");for (Class<?> parameterType : parameterTypes) {System.out.print(parameterType.getName() + " ");}System.out.println();}} catch (ClassNotFoundException e) {e.printStackTrace();}}
}

总之,java.lang.reflect 包为 Java 提供了在运行时进行动态类型探索和操作的能力,但应谨慎使用,权衡其带来的灵活性和可能产生的问题。

四. 创建对象

在 Java 中使用反射来创建对象,主要通过以下步骤:

  1. 获取要创建对象的类的 Class 对象。可以通过 Class.forName("全限定类名") 或者 对象的 getClass() 方法来获取。

  2. 获取类的构造函数。使用 getDeclaredConstructor(参数类型列表) 或 getConstructor(参数类型列表) 方法。

  3. 通过构造函数创建对象。使用 newInstance(参数值列表) 方法。

以下是一个示例代码:

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class ReflectionObjectCreation {public static void main(String[] args) {try {// 加载类Class<?> clazz = Class.forName("YourClassName");// 获取无参构造函数Constructor<?> constructor = clazz.getConstructor();// 使用无参构造函数创建对象Object object = constructor.newInstance();// 或者获取有参构造函数,并创建对象Constructor<?> parameterizedConstructor = clazz.getConstructor(String.class);Object parameterizedObject = parameterizedConstructor.newInstance("Parameter Value");} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {e.printStackTrace();}}
}

需要注意的是,使用反射创建对象可能会导致一些性能开销,并且在实际开发中应谨慎使用,通常用于一些特殊的场景,如依赖注入框架、对象工厂等。

五. 调用方法

在 Java 中使用反射来调用方法,通常按照以下步骤进行:

  1. 获取要操作的类的 Class 对象。
  2. 根据方法名和参数类型获取对应的 Method 对象。
  3. 创建类的实例。
  4. 使用 Method 对象的 invoke 方法来调用方法,并传递实例对象和参数值。

以下是一个示例代码:

import java.lang.reflect.Method;public class ReflectionMethodInvocation {public static void main(String[] args) {try {// 加载类Class<?> clazz = Class.forName("YourClassName");// 获取指定方法Method method = clazz.getMethod("methodName", parameterTypes);// 创建对象实例Object instance = clazz.newInstance();// 调用方法method.invoke(instance, parameterValues);} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException e) {e.printStackTrace();}}
}

在上述代码中,您需要将 "YourClassName" 替换为实际的类名,"methodName" 替换为要调用的方法名,parameterTypes 替换为方法参数的类型数组,parameterValues 替换为实际传递的参数值。

使用反射调用方法时要处理可能抛出的各种异常,并且要注意性能和安全性方面的考虑。一般情况下,只有在必要时才使用反射来调用方法,例如在框架或特定的动态场景中。

六. 调用成员变量

在 Java 中使用反射来访问和操作成员变量,可以按照以下步骤进行:

  1. 获取要操作的类的 Class 对象。

  2. 根据成员变量名获取对应的 Field 对象。

  3. 如果成员变量是私有访问权限,需要设置可访问性。

  4. 对成员变量进行读写操作。

以下是一个示例代码:

import java.lang.reflect.Field;public class ReflectionFieldAccess {public static void main(String[] args) {try {// 加载类Class<?> clazz = Class.forName("YourClassName");// 获取指定成员变量Field field = clazz.getDeclaredField("fieldName");// 如果是私有变量,设置可访问性field.setAccessible(true);// 创建对象实例Object instance = clazz.newInstance();// 读取成员变量的值Object value = field.get(instance);System.out.println("Value of the field: " + value);// 设置成员变量的值field.set(instance, newValue);} catch (ClassNotFoundException | NoSuchFieldException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}}
}

在上述代码中,将 "YourClassName" 替换为实际的类名,"fieldName" 替换为要操作的成员变量名,newValue 替换为要设置的新值。

使用反射访问私有成员变量时,需要设置可访问性,否则会抛出异常。同时,反射操作可能会影响代码的封装性和安全性,应谨慎使用。

相关文章:

JAVA基础 - 反射

目录 一. 简介 二. java.lang.Class类 三. java.lang.reflect包 四. 创建对象 五. 调用方法 六. 调用成员变量 一. 简介 反射是 Java 语言中的一种强大机制&#xff0c;允许程序在运行时动态地获取类的信息、访问类的成员&#xff08;包括字段、方法和构造函数&#xff…...

【系统架构设计师】二十二、嵌入式系统架构设计理论与实践③

目录 一、鸿蒙操作系统架构案例分析 1.1 鸿蒙操作系统定义 1.2 鸿蒙的层次化分析 1.2.1 内核层 1.2.2 系统服务层 1.2.3 框架层 1.2.4 应用层 1.3 鸿蒙操作系统的架构分析 1.3.1 鸿蒙操作系统架构具有4个技术特性 1.3.2 分布式架构所带来的优势 1.3.3 HarmonyOS 架构…...

【轨物推荐】经济长波:创新周期的历史

原创 丑丑姐姐 专利分析可视化 2021年08月01日 21:18 图片来源&#xff1a;Visual Capitalist 在开始本文之前&#xff0c;我们先来学习两个概念&#xff1a; 经济长波&#xff08;Long Waves&#xff09;&#xff0c;亦称“大循环理论”、“康德拉季耶夫周期”。经济长波理论…...

springboot高校勤工俭学平台-计算机毕业设计源码66824

摘 要 本研究基于Spring Boot企业框架&#xff0c;设计并实现了一款高校勤工俭学平台&#xff0c;包括首页、通知公告、新闻通知和岗位信息等功能模块。该平台旨在为高校学生提供便捷的勤工俭学信息发布与查询服务&#xff0c;促进校园内部劳动力资源的充分利用和高效管理。在研…...

CRM是什么?如何用CRM管理好客户?

在企业的销售运营中&#xff0c;客户是是贯穿始终的主体。客户的需求、偏好与满意度&#xff0c;指引着企业未来改变、优化的方向。而企业销售运营的核心&#xff0c;就是“客户至上”。 面对庞杂的客户信息&#xff0c;如何快速高效的进行客户管理呢&#xff1f;那就是要有一…...

编程入门:大学新生的指南与策略

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Spring Cloud中怎么使用Resilience4j Retry对OpenFeign进行重试

在微服务架构中&#xff0c;服务之间的通信是非常频繁的。而使用OpenFeign可以极大简化微服务之间的HTTP通信。但在复杂的分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务故障等原因而失败。因此&#xff0c;实现服务调用的重试机制显得尤为重要。Resilience4…...

【Redis 进阶】事务

Redis 的事务和 MySQL 的事务概念上是类似的&#xff0c;都是把一系列操作绑定成一组&#xff0c;让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性&#xff1a;把多个操作打包成一个整体。&#xff08;要么全都做&#xff0c;要么都不做&am…...

Linux的防火墙

一、防火墙概述 防火墙是一种计算机硬件和软件的结合&#xff0c;使internet和intranet之间建立一个安全网关&#xff08;Security Gateway&#xff09;&#xff0c;从而保护内网免受非法用户侵入的技术。 防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成。…...

跟张良均老师学大数据人工智能-批量集训营开班中

随着我国大数据和人工智能产业的飞速发展&#xff0c;未来社会对高素质科技人才的需求日益旺盛。为助力广大青少年提前掌握前沿技术&#xff0c;实现自我价值&#xff0c;泰迪智能科技多名优秀老师联合打造暑期大数据人工智能集训营&#xff0c;旨在培养具备创新精神和实战能力…...

2024年音频剪辑必备:五大最佳音频编辑软件精选!

在数字时代&#xff0c;音频剪辑已成为创意表达的重要工具。无论是音乐制作、播客编辑还是视频后期&#xff0c;一款优秀的音频剪辑软件都是不可或缺的。推荐五款备受推崇的音频剪辑工具。 福昕音频剪辑 链接&#xff1a;https://www.foxitsoftware.cn/audio-clip/ 福昕音频…...

Native Programs(本机程序)

Native Programs System Program&#xff08;系统程序&#xff09;Config ProgramStake ProgramVote ProgramAddress Lookup Table ProgramBPF LoaderEd25519 ProgramSecp256k1 Program Solana contains a small handful of native programs that are part of the validator im…...

RisingWave 1.10 发布!新增用户自定义聚合函数

我们非常高兴地宣布&#xff1a;RisingWave 1.10 版本正式发布&#xff01;新版本为大家带来了许多重要更新&#xff0c;例如&#xff1a;新增用户自定义聚合函数 (UDAF)、支持从游标获取多个更新、支持可溢出哈希 Join、增强 CDC 连接器、新增 Sink 连接器等。一起来了解本次更…...

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议&#xff0c;‌它允许不同类型的设备之间进行通信&#xff0c;‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器&#xff08;‌PLC&#xff09;‌通信开发&#xff0c;‌现已广泛应用于工业自动化领…...

fal.ai发布超分辨率模型——AuraSR V2

今天&#xff0c;我们发布了单步 GAN 升频器的第二个版本&#xff1a; AuraSR。 我们在上个月发布了 AuraSR v1&#xff0c;社区的反响让我们深受鼓舞&#xff0c;因此我们立即开始了新版本的训练。 AuraSR 基于 Adobe Gigagan 论文&#xff0c;以 lucidrain 的实现为起点。Gi…...

SYD88xx代码复位不成功和解决办法

原来的复位代码如下: void ota_manage(void){#ifdef _OTA_if(ota_state){switch(ota_state){case 1 : #if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)dbg_printf("start FwErase\r\n");#endifCmdFwErase();#if defined(_DEBUG_) || defined(_SYD_RTT_DEBUG_)db…...

加油,为Vue3提供一个可媲美Angular的ioc容器

为什么要为Vue3提供ioc容器 Vue3因其出色的响应式系统&#xff0c;以及便利的功能特性&#xff0c;完全胜任大型业务系统的开发。但是&#xff0c;我们不仅要能做到&#xff0c;而且要做得更好。大型业务系统的关键就是解耦合&#xff0c;从而减缓shi山代码的生长。而ioc容器是…...

RS485 CAN SPI IIC UART RS232这些通信协议传输距离、传输速度对比给出比较顺序-笔记(面试必备)

各类通信协议&#xff08;RS485、CAN、SPI、I2C、UART、RS232&#xff09;的传输距离和传输速度各有不同&#xff0c;适用于不同的应用场景。以下是这些通信协议的传输距离和传输速度的对比及排序&#xff1a; 传输距离比较&#xff08;从长到短&#xff09; RS485 最大传输距…...

高频JMeter软件测试面试题

近期&#xff0c;有很多粉丝在催更关于Jmeter的面试题&#xff0c;索性抽空整理了一波&#xff0c;以下是一些高频JMeter面试题&#xff0c;拿走不谢~ 一、JMeter的工作原理 JMeter就像一群将请求发送到目标服务器的用户一样&#xff0c;它收集来自目标服务器的响应以及其他统计…...

iptables netfilter

iptables -L --line...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...