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

java基础知识——26.反射

这篇文章我们来讲一下java的代理与反射,这是很重要的一部分内容。

目录

1.什么是反射

2.获取class对象的三种方式

3.反射获取构造方法

4.利用反射来获取成员变量

5.利用反射来获取成员方法

6.反射的作用

7.反射小结


1.什么是反射

首先,我们来看一下什么是反射

官方定义:反射允许对封装类的字段,方法和构造函数的信息进行编程访问

解释:反射允许对成员变量成员方法构造方法的信息进行编程访问

说人话:就是反射可以把类里面的所有信息都获取出来,并对获取出来的信息进行操作

反射的用处举例:

idea里面的自动提示功能:

idea中的方法参数提示功能(快捷键:Ctrl+P):

问:从类里面拿东西,IO流也行,为什么要用反射呢?

答:IO流无法判断类的构造函数和普通方法,无法判断同名的成员变量和方法中的变量。

反射要学习的内容:

2.获取class对象的三种方式

获取class对象有三种方式

  • Class.forName("全类名")
  • 类名.class
  • 对象.getClass()

注意:我们通过反射获取的不是.java文件,获取的是.class字节码文件,然后我们在.class字节码文件中找到类的相应信息,然后对这些信息进行操作

下面,我们来看一下一个类的三个阶段

 解析:首先,我们编写一个.java文件,然后它会被JVM编译成.class文件,这个阶段是在硬盘中实现的,这个阶段也称为源代码阶段。然后,我们运行程序,.class被拿到内存中加载,这个阶段是加载阶段,然后,我们创建对象,计算机就会在内存中创建出类的实例化对象,这个阶段就是运行阶段。其中,这三个阶段分别对应了上面反射获取类的三种方式

下面,用代码来具体的演示一下这三种方式:

有一个疑问,它为什么是true?首先,我要明白我们通过反射获取的是什么?我们获取的是类的.class字节码文件,我们获取它干啥?我们通过获取这个类的字节码文件然后分析然后来获取类的信息,所以,我们通过反射最终获取的是类的信息,因为这是同一个类,所以它的信息是一样的,所以是true! 

3.反射获取构造方法

上面,我们讲了如何获取类的字节码文件,现在,我们来讲一下如果在类的字节码文件中获取类的构造方法信息。

我们知道,java的思想是万物皆对象,我们通过反射获取类的字节码文件,那么就用Class类对象来接收它,我们获取类的构造方法,那就通过Constructor类对象来接收它,我们获取类的字段(成员变量),那就通过Field类对象来接收它,我们获取类的成员方法,那就通过Method类对象来接收它。

下面,我们来看一下用反射获取类的构造方法的方法:

(这些方法的格式和javaAPI的格式是一样的,可以按照那个的格式来理解)

 下面通过具体实例来看一下里面的一些方法的使用:

然后看一下运行结果:

 再看一下利用构造方法中的类来创建对象:

结果:

注意:我们在调用这些方法的时候,它获取的内容或受到权限修饰符的限制,也就是说,当我们用不同的方法虽然获取的都是构造方法,但是构造方法的权限修饰符不一样,而导致最终的结果也会不一样。并且,我们用这些构造方法的对象中的类来创建对象时,也会受到权限修饰符的影响,甚至受到形参的影响,但是这些都是小问题,我们在具体运用时是可以自己解决的,所以我上面就没有演示那些问题的案例。

4.利用反射来获取成员变量

 上面已经具体的讲过了反射获取类信息的本质,所以这里就不多说了。

下面,我们来看一下利用反射来获取成员变量的方法:

 下面通过具体案例来演示一下:

看一下结果:

再用它来创建对象看一下:

还是要注意权限修饰符

5.利用反射来获取成员方法

下面,我们来看一下利用反射来获取成员方法的方法:

 下面,还是来看一下具体实例吧

结果:

6.反射的作用

反射的作用主要有以下两点:

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法

下面通过具体的代码案例来演示下反射的这两个作用

案例一:对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去

代码如下:

 结果如下:

案例二:反射可以跟配置文件结合的方式,动态的创建对象,并调用方法

 代码如下:

运行结果:

7.反射小结

 下面来小结一下反射(自己的理解)

首先,我们要区分类和对象,类是模板,对象是类的实例化。我们反射获取的是类的.class文件,不是对象。我们知道java有.java文件(就是我们自己写的)和.class字节码文件(JVM编译的),我们反射获取的是类的.class字节码文件,我们获取到它后就可以分析解剖它,说白了就是获取类的所有信息,于是,我们可以通过反射来获取类的成员变量,成员方法,构造方法(实际上是从类的.class字节码文件中获取的)。而java又是面向对象的,所以我们获取出来这些信息后,又把这些信息全部封装到类中,于是有了Constructor,Field,Method类有了这些类我们就可以创建这些类的对象,然后通过对象和类里面的方法,就可以把那些信息给拿出来了。注意,我们通过获取.class字节码文件然后获取类的那些信息,我们是直接拿不出来的,那些信息都被封装在类里面。因为我们有了这些类的对象,而这些对象里面都是可以操作我们手写类的方法,所以我们就可以通过这些类的对象来创建我们手写类的对象了。就比如,我们有了Constructor类对象,它是我们构造方法类对象,所以呢我们就可以通过这个对象来操作我们的手写类的构造方法,然后就创建出对象了。Field类对象也一样,我们有一个手写类对象,我们把这个类对象传进去,然后调用Field类对象方法,就可以修改对象的成员变量值了。Method的类对象的逻辑也是一样的。这上面就是反射的基本逻辑。但是有些细节我们需要注意:比如说权限修饰符的问题,比如说方法的重载,这些都是细节问题,都需要注意!

相关文章:

java基础知识——26.反射

这篇文章我们来讲一下java的代理与反射,这是很重要的一部分内容。 目录 1.什么是反射 2.获取class对象的三种方式 3.反射获取构造方法 4.利用反射来获取成员变量 5.利用反射来获取成员方法 6.反射的作用 7.反射小结 1.什么是反射 首先,我们来看…...

【容器化】Docker 简介和安装

【容器化】Docker 简介和安装 DockerDocker的应用场景Docker 的优点1、快速,一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 Docker 架构Docker 安装Ubuntu Docker 、Debian Docker 安装使用官方安装脚本自动安装手动安装使用 Shell 脚…...

性能测试场景分析并设计?超细案例讲解,看这篇就够了

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 性能测试场景&…...

JAVA9新特性

JAVA9新特性 概述 ​ 经过4次推迟,历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统,在最初设想的时候并没有想过那么复杂,花费的时间超出预估时间。距离java8大约三年时间。 ​ Java 9提供了超过150项新功能特性&#x…...

( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】

❓645. 错误的集合 难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…...

2023年全国最新道路运输从业人员精选真题及答案63

百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.在危险货物道路运输过程中,(&#x…...

Kettle安装与使用

一、Kettle简介 Kettle最早是一个开源的ETL(Extract-Transform-Load的缩写)工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。它由Java开发,…...

C51 - DS18B20

Thermometer 1> 实验概述2> 硬件设计3> DS18B203.1> 原理框图3.2> 数据格式 4> 单总线(1-Wire)通讯协议4.1> 初始化(复位)时序4.2> 写-DS18B20时序4.3> 读-DS18B20时序4.4> 命令 5> 程序设计5.1…...

手把手教你使用vue2搭建微前端micro-app

​ 简述 本文主要讲述新手小白怎么搭建micro-app,几乎是每一步都有截图说明。上手应该很简单。 研究背景 这段时间在网上找了很多有关微前端相关的知识,起初本来是想着先搭建一个single-spa,但是奈何网上能找到的内容都是千篇一律。我也是…...

DDR3(MIG核配置官方demoFPGA代码实现及仿真)

由于直接对 DDR3 进行控制很复杂,因此一般使用 MIG IP 来实现,同时为了更简单地使用 MIG IP,我们采用 AXI4 总线协议进行控制。下面首先介绍 MIG IP 的配置,然后看看官方 demo (里面包含一个仿真要用到的 DDR3 模型&am…...

传奇人物《周兴和》书连载之67 不辱神圣的使命

不辱神圣的使命 这里,先前还是一个十分神秘的地方。 外人和车辆要想进入这片区域,那是绝对不允许的。这片区域隐于群山之中,且戒备森严,外人若想进入,那是要经过好几道政治审查和随身检查的。近年来,随着…...

Spring框架中的单例Beans是线程安全的么?

在Spring框架中,单例Beans默认是线程安全的。 当你在Spring框架中声明一个单例Bean并配置为默认的单例作用域时,Spring会确保对该Bean的并发访问是线程安全的。以下是一个简单的代码演示: 假设我们有一个名为 SingletonBean 的单例 Bean 类…...

AI脚本插件开发-链接图自动建立档名-插件制作源码-illustrator插件开发

文章目录 1.illustrator1.1.app.activeDocument1.2.selection2.模块分析3.源码工程4.功能描述5.作者答疑本文主要分析一款插件的源码,链接图自动建立档名,代码一般较长,读者耐心阅读,对于学习插件开发具有不小的帮助。先介绍了一下基础资料,如有不懂的地方,就去这些资料里…...

rust智能指针

智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。引用和智能指针的另一个不同在于前者仅仅是借用了数据…...

Git、Gitee、Github、Gitlab区别与联系

Git:本地软件,无需联网即可使用,实现本地代码的管理。 分布式版本控制系统,是一种工具,用于代码的存储和版本控制。 将本地文件通过一定的操作将其同步上传到Github或Gitee Gitee:是一家中…...

接口优化的策略

1.批处理 批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。 //批量入库 batchInsert();List的安全操作有以下几种方式: 使…...

android 隐藏底部虚拟按键

方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键&#xff0c;并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…...

基于电流控制的并网逆变器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景)

return 关键字 不知道我们大家是否有一个疑惑&#xff1a;我们下载一个大型游戏软件&#xff08;王者荣耀&#xff09;&#xff0c;都要花几个小时去下载&#xff0c;但是一旦我们游戏连输&#xff0c;想要删除这个软件的时候&#xff0c;它仅仅只需要十几秒&#xff0c;这是为…...

基于深度学习的OCR技术

随着数字化时代的到来&#xff0c;图片识别技术越来越受到人们的关注。其中&#xff0c;OCR技术作为图片处理的一个重要分支&#xff0c;可以将扫描的图片进行自动识别和分类&#xff0c;极大地提高了工作效率。本文将介绍有道实况OCR技术的相关内容&#xff0c;帮助读者更好地…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

探索Selenium:自动化测试的神奇钥匙

目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

前端调试HTTP状态码

1xx&#xff08;信息类状态码&#xff09; 这类状态码表示临时响应&#xff0c;需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分&#xff0c;客户端应继续发送剩余部分。 2xx&#xff08;成功类状态码&#xff09; 表示请求已成功被服务器接收、理解并处…...