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.反射的作用
反射的作用主要有以下两点:
- 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
- 结合配置文件,动态的创建对象并调用方法
下面通过具体的代码案例来演示下反射的这两个作用
案例一:对于任意一个对象,都可以把对象所有的字段名和值,保存到文件中去
代码如下:

结果如下:

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

运行结果:

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() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…...
基于电流控制的并网逆变器(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景)
return 关键字 不知道我们大家是否有一个疑惑:我们下载一个大型游戏软件(王者荣耀),都要花几个小时去下载,但是一旦我们游戏连输,想要删除这个软件的时候,它仅仅只需要十几秒,这是为…...
基于深度学习的OCR技术
随着数字化时代的到来,图片识别技术越来越受到人们的关注。其中,OCR技术作为图片处理的一个重要分支,可以将扫描的图片进行自动识别和分类,极大地提高了工作效率。本文将介绍有道实况OCR技术的相关内容,帮助读者更好地…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
