再学Java基础——反射

Java中的反射(Reflection)是一种强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且允许对这些对象进行实例化、调用等操作。这种能力使Java代码具有高度的动态性和灵活性。

反射的基本概念

反射提供了以下功能:

  1. 运行时获取类的信息:如类的名称、修饰符、包信息、父类、实现的接口、字段、方法等。
  2. 运行时创建对象:通过反射可以动态地创建类的对象。
  3. 运行时调用方法:通过反射可以调用类的方法,包括私有方法(虽然通常不推荐这样做)。
  4. 运行时修改字段的值:通过反射可以修改类的字段值,包括私有字段(同样,通常不推荐直接修改私有字段)。

如何使用反射

  1. 获取Class对象:反射操作首先需要获取一个Class对象,这通常通过三种方式获取:

    • 使用.class语法,如String.class
    • 使用对象的getClass()方法,如String str = "Hello"; Class<?> clazz = str.getClass();
    • 使用Class.forName()方法,通过类名(字符串形式)动态加载类,如Class<?> clazz = Class.forName("java.lang.String");
  2. 获取类的信息:通过Class对象,可以获取类的各种信息,如类的名称(getName())、修饰符(getModifiers())、父类(getSuperclass())、实现的接口(getInterfaces())、字段(getDeclaredFields())、方法等(getDeclaredMethods())。

  3. 创建对象:通过Class对象的newInstance()方法或getDeclaredConstructor()获取Constructor对象并调用其newInstance()方法创建类的实例。注意,如果类没有无参构造函数,则需要使用getDeclaredConstructor()并传入相应的参数类型。

  4. 调用方法:首先通过Class对象的getMethod()getDeclaredMethod()获取Method对象,然后调用其invoke()方法。注意,如果方法是私有的,则需要先设置setAccessible(true)

  5. 修改字段的值:首先通过Class对象的getField()getDeclaredField()获取Field对象,然后调用其set()方法修改字段的值。同样,如果字段是私有的,则需要先设置setAccessible(true)

示例代码

以下是一个简单的反射使用示例:

public class ReflectionExample {  public static void main(String[] args) throws Exception {  // 获取String类的Class对象  Class<?> clazz = String.class;  // 创建String对象  Object obj = clazz.getDeclaredConstructor(String.class).newInstance("Hello, Reflection!");  // 调用String类的length()方法  Method method = clazz.getMethod("length");  int length = (int) method.invoke(obj);  System.out.println("Length: " + length);  // 获取String类的value字段(String内部的一个私有字段),并设置其值(注意:这通常是不推荐的)  Field field = clazz.getDeclaredField("value");  field.setAccessible(true); // 设置为可访问,因为value是私有的  char[] value = (char[]) field.get(obj);  for (int i = 0; i < value.length; i++) {  value[i] = Character.toUpperCase(value[i]); // 将字符串转换为大写  }  field.set(obj, value); // 设置回String对象  // 输出修改后的字符串  System.out.println((String) obj); // 输出: HELLO, REFLECTION!  }  
}


注意:直接修改类的私有字段通常是不推荐的,因为这破坏了封装性,并可能导致不可预测的行为。在实际应用中,应该尽量避免这样做,除非有充分的理由。

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

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

相关文章

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK获取相机的Statistics图像传输统计信息&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和相机Statistics图像传输统计信息的技术背景Baumer工业相机通过NEOAPISDK获取相机的Statistics图像传输统计信息技术1.引…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

搭建MongoDB分片集群

文章目录 一、什么是分片二、分片集群1、组件构成2、分片集群内各组件间交互 三、数据如何切分四、分片策略1、哈希分片2、范围分片 五、分片集群架构六、搭建分片集群1、涉及主机2、所有主机安装MongoDB3、分片节点副本集的创建3.1、第一套副本集shard13.1.1、准备存放数据和日…

课时114:sed命令_进阶实践_高阶用法1

2.2.3 高阶用法1 学习目标 这一节&#xff0c;我们从 基础知识、缓存实践、小结 三个方面来学习。 基础知识 简介 对于sed命令来说&#xff0c;除了我们经常使用的模式空间之外&#xff0c;它还支持一个叫暂存空间(Hold Space)的模式,所谓的暂存空间&#xff0c;也就是说&a…

计算机网络期末试题

第一章 概述 一. 单选题&#xff08;共13题&#xff0c;36.4分&#xff09; 1. (单选题) 因特网起源于( &#xff09;网络。 A. ARPANETB. EthernetC. CATVD. CERNET 我的答案: A:ARPANET;正确答案: A:ARPANET; 2.8分 2. (单选题)人们把( &#xff09;年作为因特网的诞…

从零开始搭建一个vue项目

从零开始搭建一个vue项目 一、环境准备 1.1 安装node.js 选择合适的LTS版本&#xff0c;然后下载安装&#xff0c;安装地址&#xff1a;https://nodejs.org/en/download 在命令行中查看已安装的node.js版本 node -v v14.14.01.2 切换为淘宝的镜像源 解决国内下载慢的问题,…

(五)SQL系列练习题(上)创建、导入与查询 #CDA学习打卡

目录 一. 创建表 1&#xff09;创建课程表 2&#xff09;创建学生表 3&#xff09;创建教师表 4&#xff09;创建成绩表 二. 导入数据 1&#xff09;导入课程科目数据 2&#xff09;导入课程成绩数据 3&#xff09;导入学生信息数据 4&#xff09;导入教师信息数据 …

Mac OS 笔记

rvm、Ruby、gem、CocoaPods的安装与卸载 安装rvm curl -fsSL https://get.rvm.io | bash -s stable --ruby --autolibsenable --auto-dotfilesrvm -v # 查看版本安装脚本 /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install…

决策树算法

目录 决策树的应用决策树算法分类决策树算法开源实现决策树的使用 决策树是一种常用的数据挖掘方法&#xff0c;它是一种树形结构的算法&#xff0c;用于决策分析和预测。 决策树由节点和分支构成&#xff0c;其中节点分为内部节点和叶节点两种。内部节点表示一个特征或属性&a…

《金融研究》:普惠金融改革试验区DID工具变量数据(2012-2023年)

数据简介&#xff1a;本数据集包括普惠金融改革试验区和普惠金融服务乡村振兴改革试验区两类。 其中&#xff0c;河南兰考、浙江宁波、福建龙岩和宁德、江西赣州和吉安、陕西铜川五省七地为普惠金融改革试验区。山东临沂、浙江丽水、四川成都三地设立的是普惠金融服务乡村振兴…

【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)

1 注册功能 1.1 注册功能form组件 1.2 注册功能前端 1.3 注册功能后端 1.4 forms组件和前后端总结 2 登录功能 2.1 登录前端 2.2 生成验证码 1 注册功能 1.1 注册功能form组件 # 注册页面-用户名-密码-确认密码-邮箱-手机号-头像# form组件 可以帮助我们1 快速生成前端页面2 数…

Xamarin.Android项目显示Properties

在 Visual Studio 2022 中&#xff0c;如果您需要调出“Properties”&#xff08;属性&#xff09;窗口&#xff0c;您可以使用以下几种方法&#xff1a; 快捷键&#xff1a; 您可以按 F4 快速打开当前选择项的“Properties”窗口。

pytorch笔记:ReplicationPad1d

torch.nn.ReplicationPad1d(padding) 在 PyTorch 中&#xff0c;ReplicationPad1d 是一种用于一维数据的填充层该层通过复制序列的边缘值来增加数据的长度&#xff0c;这在卷积神经网络中常用于保持数据尺寸主要参数 padding 可以是一个整数或一个元组。 如果是一个整数&…

Python 植物大战僵尸

文章目录 效果图项目结构实现思路源代码 效果图 项目结构 实现思路 下面是代码的实现思路&#xff1a; 导入必要的库和模块&#xff1a;首先&#xff0c;我们导入了Python的os、time库以及pygame库&#xff0c;还有植物大战僵尸游戏中用到的各个植物和僵尸的类。 初始化游戏和…

从零开始学AI绘画,万字Stable Diffusion终极教程(一)

【第1期】SD入门 2022年8月&#xff0c;一款叫Stable Diffusion的AI绘画软件开源发布&#xff0c;从此开启了AIGC在图像上的爆火发展时期 率先学会SD的人&#xff0c;已经挖掘出了越来越多AI绘画有趣的玩法 从开始的AI美女、线稿上色、真人漫改、头像壁纸 到后来的AI创意字、AI…

Android性能优化面试题汇总

Android的性能优化涉及多个方面,如启动优化、稳定性优化、内存优化、网络优化、电量优化、安全优化等方面。 一、稳定性优化 1.1 你们做了哪些稳定性方面的优化 随着项目的逐渐成熟,用户基数逐渐增多,DAU持续升高,我们遇到了很多稳定性方面的问题,对于我们技术同学遇到…

如何在 Ubuntu 16.04 上使用 WireGuard 创建点对点 VPN

简介 WireGuard 是一种现代、高性能的 VPN&#xff0c;旨在提供易于使用的同时又具有强大的安全性。WireGuard 专注于在网络接口上使用公钥认证加密来提供安全连接。这意味着&#xff0c;与大多数 VPN 不同&#xff0c;它不强制执行拓扑结构&#xff0c;因此可以通过操纵周围的…

条件依赖性的方法示例

5个条件判断一件事情是否发生&#xff0c;每个条件可能性只有2种&#xff08;发生或者不发生&#xff09;&#xff0c;计算每个条件对这件事情发生的影响力&#xff0c;条件之间有很强的依赖关系。 例一 如果条件之间有很强的依赖关系&#xff0c;那么简单地计算每个条件独立的…

[论文阅读] 测试时间自适应TTA

最初接触 CVPR2024 TEA: Test-time Energy Adaptation [B站]&#xff08;1:35:00-1:53:00&#xff09;https://www.bilibili.com/video/BV1wx4y1v7Jb/?spm_id_from333.788&vd_source145b0308ef7fee4449f12e1adb7b9de2 实现&#xff1a; 读取预训练好的模型参数设计需要更…

Vue 组件通信

组件通信 组件与组件之间的数据传递 组件的数据是独立的&#xff0c;无法直接访问其他组件的数据。通过组件通信&#xff0c;可以访问其他组件的数据。 组件关系 父子关系非父子关系 组件通信解决方案 父子关系 父->子 父组件通过props将数据传递给子组件 App.vue …