Java 反射笔记总结(油管)
Java系列文章目录
IDEA使用指南
Java泛型总结(快速上手详解)
Java Lambda表达式总结(快速上手详解)
Java Optional容器总结(快速上手图解)
Java 自定义注解笔记总结(油管)
Java 抽象知识笔记总结(油管)
文章目录
- Java系列文章目录
- 一、前言
- 二、学习内容:
- 三、问题描述
- 四、解决方案:
- 4.1 反射的概念与应用
- 4.1.1 引入反射
- 4.1.2 反射的使用
- 五、总结:
- 5.1 学习总结:
一、前言
目的:学习反射的使用
- 对油管博主John讲解的反射相关知识进行笔记总结
- 有一个基础概念与学会基本使用
二、学习内容:
- 反射的概念与应用
- 什么会导致出错
三、问题描述
- 本人对反射的知识没有经验
四、解决方案:
4.1 反射的概念与应用
4.1.1 引入反射
getClass() 方法是 Object 类的一个方法,它返回调用该方法的对象所属的类的 Class 对象。Class 对象提供了关于类的信息以及操作类的能力
在Java中,类的成员变量(字段)如果被声明为private或final,那么它们在类外部是不可直接访问或修改的。通过反射机制,我们可以绕过这些访问限制,直接访问和修改这些私有变量或最终变量。
- 这是因为反射提供了一种动态访问类和对象的能力,包括字段、方法和类的信息。
具体来说,使用反射可以按照以下步骤操作:
- 获取类的Class对象:首先,我们需要获得包含目标字段的类的Class对象。
- 获取字段对象:通过Class对象调用getDeclaredField()或getField()方法获取特定字段的Field对象。
- 设置可访问性:对于private字段,我们需要调用Field对象的setAccessible(true)方法,以允许我们访问私有字段。
- 修改字段值:通过Field对象的set()方法,可以设置字段的新值,甚至对于final修饰的字段也可以进行修改。
参考代码:
package org.example;public class Cat {private final String name;private int age;public Cat(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}public void meow(){System.out.println("Meow");}public void setAge(int age) {this.age = age;}private void heyThisIsPrivate(){System.out.println("Hey this is private");}private static void thisIsAPrivateStaticMethod(){System.out.println("Hey this is thisIsAPrivateStaticMethod");}private static void thisIsAPublicStaticMethod(){System.out.println("Hey this is thisIsAPublicStaticMethod " );}}
package org.example;import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;public class Main {public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {Cat mycat = new Cat("Barsik", 5);Field[] declaredFields = mycat.getClass().getDeclaredFields();for (Field field : declaredFields){if (field.getName().equals("name")){field.setAccessible(true);//必须有field.set(mycat, "Murzik");}}
// System.out.println(mycat.getName());Method[] declaredMethods = mycat.getClass().getDeclaredMethods();for (Method declaredMethod : declaredMethods) {if (declaredMethod.getName().equals("thisIsAPublicStaticMethod")) {declaredMethod.setAccessible(true);declaredMethod.invoke(null);}// System.out.println(declaredMethod.getName());}}
}
4.1.2 反射的使用
- 获取class对象

- 获取所有变量getDeclaredFields()

- 如果是私有的方法或属性要加上setAccessible(true);
这是开启使用权限不然会报错
开头提到的修改变量


- 获取方法每次顺序都不一样所以我们使用判断

注意私有方法开权限

在 Java 反射中,invoke 方法用于调用一个方法。
invoke 方法的签名如下:
public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;
参数解释:
- obj:这是要调用方法的对象实例。如果是静态方法,则此参数应为 null。
- args:方法调用所需的参数数组
何时放实例:
非静态方法:
- 非静态方法是与对象实例关联的,因此需要一个具体的对象实例来调用这些方法。 在调用非静态方法时,你需要传递一个对象实例作为 invoke方法的第一个参数。
静态方法:
- 静态方法是与类本身关联的,不是与类的实例关联的。 当调用静态方法时,你可以传递 null 作为 invoke 方法的第一个参数。

- 所以静态方法不放入实例直接null
五、总结:
5.1 学习总结:
Java 反射是一种强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并能够创建和操作对象。
反射主要用于以下几种情况:
- 动态获取类信息:例如,获取类的名称、字段、方法等。
- 创建对象:可以通过 Class 对象的 newInstance() 方法创建对象。
- 调用方法:可以通过 Method 对象的 invoke() 方法调用方法。
- 设置和获取字段值:可以通过 Field 对象的 set 和 get 方法来设置和获取字段值。
注意:
反射机制在某些情况下非常有用,例如在框架、库中的依赖注入或序列化/deserialization中,可以动态地操作对象的状态。
然而,使用反射也有其弊端,比如性能开销较大、代码可读性降低以及可能违反封装原则等,因此在常规开发中应谨慎使用。
- 反射在运行时操作所有内容所以无法进行编译时的优化
- 反射比执行相同操作代码慢
- 私有变量注意要开启权限
- 静态方法调用的时候不需要放入实例
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。
相关文章:
Java 反射笔记总结(油管)
Java系列文章目录 IDEA使用指南 Java泛型总结(快速上手详解) Java Lambda表达式总结(快速上手详解) Java Optional容器总结(快速上手图解) Java 自定义注解笔记总结(油管) Jav…...
HTML表格、表单、标签、CSS、选择器
目录 一、HTML表格 二、表单 三、布局标签 四、CSS 五、选择器 一、HTML表格 table:表格 tr:行 td:单元格;rowspan:纵向合并相邻单元格;clospan:横向合并相邻单元格 th:单元格加粗居中 border&…...
【javaWeb技术】·外卖点餐小程序(脚手架学习1·数据库)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀系统学javaWeb开发_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 【免费】项…...
LVS 实现四层负载均衡项目实战--DR模式
一、环境准备 主机名IP地址router eth0:172.25.254.100 eth1:192.168.0.100 clienteth0:172.25.254.200lvseth1:192.168.0.50web1web2 1、client配置 [rootclient ~]# cat /etc/NetworkManager/system-connections/eth0.nmconne…...
Python与Qt的对应版本
Python与Qt的对应版本并没有严格的一一对应关系,但通常在使用Python与Qt进行开发时,会选择一个兼容性较好的版本组合。Qt的Python绑定库主要是PyQt和PySide,以下是几个常见的搭配: 1. **PyQt5**: - Python 3.5及以上版…...
WPF篇(12)-Image图像控件+GroupBox标题容器控件
Image图像控件 Image也算是独门独户的控件,因为它是直接继承于FrameworkElement基类。 Image控件就是图像显示控件。Image类能够加载显示的图片格式有.bmp、.gif、.ico、.jpg、.png、.wdp 和 .tiff。要注意的是,加载.gif动画图片时,仅显示第…...
LeetCode 热题 HOT 100 (024/100)【宇宙最简单版】
【哈希表】No. 0128 最长连续序列【中等】👉力扣对应题目指路 希望对你有帮助呀!!💜💜 如有更好理解的思路,欢迎大家留言补充 ~ 一起加油叭 💦 欢迎关注、订阅专栏 【力扣详解】谢谢你的支持&am…...
如何在AWS上进行 环境迁移
在 AWS 上进行环境迁移通常包括以下几个步骤和最佳实践: 1. 评估和规划 评估当前环境:审查现有的应用程序、数据库、网络架构和依赖关系。确定迁移目标:明确迁移的目标(如成本节约、性能提升、可扩展性等)。选择迁移策略:根据应用程序的类型和复杂性,选择合适的迁移策略…...
云服务器和物理服务器的优缺点对比
云服务器优点在于灵活性强、成本效益高、易于扩展且支持全球化部署;缺点则包括安全性与可控性相对较弱,性能可能受限,以及存在服务中断风险。物理服务器则以其高性能、高稳定性、强安全性和完全可控性著称,但成本较高、扩展性受限…...
postgreSQL16添加审计功能
下载审计插件 https://github.com/pgaudit/pgaudit/releases他的分支版本支持不同的PGSQL按需下载 编译安装审计插件 tar -xvf pgaudit-16.0.tar.gzmake install USE_PGXS1 PG_CONFIG/app/postgresql/bin/pg_config启用postgreSQL审计功能 修改配置文件# 启用 pgAudit shar…...
如何应用OceanBase 的实时SQL诊断,解决AP场景下的痛点
随着数据量的快速增长与用户需求的变化,数据库的管理与优化工作日益凸显其重要性。作为DBA及开发者,您是否曾面临以下挑战: ○ 分析场景下,在处理大规模数据的且耗时较长的查询是,常涉及海量数据的处理及复杂的计算&…...
【数据结构】—— 栈
一、栈的基本概念1、栈的定义2、栈的常见基本操作 二、栈的顺序存储1、栈的顺序存储结构2、顺序栈存储实现(1)初始化(2)判空(3)进栈(4)出栈(5)取栈顶元素&…...
Kafka服务端日志详解
文章目录 服务端日志Topic消息存储方式主体介绍log文件追加记录消息index和timeindex索引文件 日志文件清理Kafka的文件高效读写机制Kafka的文件结构顺序写磁盘零拷贝 合理配置刷盘频率客户端消费进度管理 服务端日志 Kafka的日志信息是通过conf/server.properties文件中的log…...
C++ 数据语义学——进程内存空间布局
进程内存空间布局 1. 栈(堆栈/栈区)2. 堆(堆区)3. BSS段4. 数据段5. 代码段进程内存空间布局示意图可执行文件的内存布局示例代码 当把一个可执行文件加载到内存后,就变成了一个进程。这个虚拟空间(内存&am…...
【数据结构】六、图:2.邻接矩阵、邻接表(有向图、无向图、带权图)
二、存储结构 文章目录 二、存储结构❗1.邻接矩阵1.1无向图❗邻接矩阵-无向图代码-C 1.2有向图❗邻接矩阵-有向图代码-C 1.3带权图1.4性能分析1.5相乘 ❗2.邻接表2.1无向图2.2有向图❗邻接表-C 邻接矩阵VS邻接表邻接矩阵邻接表 ❗1.邻接矩阵 图的邻接矩阵(Adjacency Matrix) 存…...
财务会计与管理会计(三)
文章目录 销售回款提成表MATCH函数的模糊查询在提成类业务中的应用 营业收入分类数据分析OFFSET函数在制作图表数据中的应用 自动生成销售记录对账单VLOOKUP函数的应用 销售回款提成表 MATCH函数的模糊查询在提成类业务中的应用 G3INDEX(I$1:M$1,MATCH(E3,H3:M3,1)) G3INDEX(…...
【数据结构和算法】(基础篇三)——栈和队列
栈和队列 栈(Stack)和队列(Queue)是两种非常基本的数据结构,它们主要用于存储和检索元素。尽管它们都用于管理一组数据项,但它们的访问规则和数组都是不同的。 栈 栈是一种后进先出(Last In,…...
Linux截图工具gsnap移植arm平台过程记录
Linux截图工具gsnap移植arm平台过程记录 最近工作中一款新产品开发接近尾声,需要写文档截图产品图形,找了一款开源的Linux截屏工具gsnap,将其移植到ARM产品中,这里记录一下移植过程。 gsnap 这个工具源代码就是一个C语言源文件&a…...
密码学知识点02
#来自ウルトラマンレオ(雷欧) 1 常见加密方式 2 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 常见加密算法: DES : Data…...
实现Pytest测试用例按顺序循环执行多次
要实现测试用例按顺序循环执行多次,可以使用 pytest 的自定义装饰器或插件。这里有两种方法可以实现这个需求: 方法一:使用 pytest-repeat 插件 pytest-repeat 插件允许你重复执行测试用例。你可以使用 --count 参数来指定每个测试用例的执…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
