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

反射简单介绍

反射就是从类里拿东西

 有的人可能会想为什么不能用io流,从上往下一行一行的读也能获取类中的信息,为什么要用反射呢?

假如我们io流,从左到右一行一行的读取数据,如果碰到局部变量和成员变量同名,怎么区分,还得结合上下文,比较麻烦

但用反射可以一步一步的扒出所有信息

 

!!!思考:怎样用反射扒出所有信息,它是通过什么手段实现

回顾: 当我们编写好以.java为扩展名的文件后,如果它能被运行(比如其中包含main函数),那么我们能通过点击IDEA里的运行按钮运行这个.java文件。

IDEA向我们隐藏了一个关键步骤:它首先是把.java文件编译成扩展名是.class的字节码文件,随后,Java的虚拟机(JVM)在当前的操作系统上(比如window 10)上运行这个.class文件。

:通过某些工具,我们能打开.class文件,并也能看到其中包含的属性和方法,但我们不能直接针对.class文件编程,我们得使用ClassC是大写)这个类(规则)。当一个类或接口被装入到Java虚拟机

JVM)时便会产生一个与和它相关联的java.lang.Class对象,我们就可以通过这个产生class对象来访问和使用目标类的属性和方法,而反射的作用就是如此

所以要实现反射

先获去class对象A

通过class对象的方法、获取构造方法的对象、使用构造方法对象的方法得到它的各种信息,此外通过获取的构造方法还可以创建对象

通过class对象的方法、获取成员变量的对象、使用成员变量对象的方法得到它的各种信息

通过class对象的方法、获取成员方法的对象、使用成员方法对象的方法得到它的各种信息,此外还可以运行方法

获取class字节码文件的对象

 

获取构造方法的对象(对象属于 Constructor 类)

 

获取单个构造方法,注意有参构造在获取的时候要写对应的参数形式(数据类型 .class , 获取非 public 的构造方法注意单词里要有 Declared

 

 1对应public

获取成员变量的对象(对象属于Field类)

 获取成员方法的对象(对象属于Method类)

    //一.获取class字节码文件的对象Class aClass = Class.forName("java_3gao.com.hz.test.Student");//二.①获取构造方法的对象(这里举例获取private Student(String name, int age) 构造方法)//单个构造方法的对象Constructor constructor = aClass.getDeclaredConstructor(String.class,int.class);//②使用获取的构造方法得到它的各种信息System.out.println(constructor.getModifiers());//返回修饰符对应的数字:1对应public,2对应privateSystem.out.println(constructor.getParameterCount());//返回方法的参数个数//③通过获取的构造方法来创建对象// setAccessible(true)是取消java修饰符检查,即构造方法虽然是private也能在这里创建对象)constructor.setAccessible(true);Student s1 = (Student)constructor.newInstance("王五", 16);System.out.println(s1.toString());//三.①获取成员变量的对象//单个成员变量的对象Field field = aClass.getDeclaredField("name");//②使用获取的构造方法得到它的各种信息System.out.println(field.getModifiers());//返回修饰符对应的数字:1对应public,2对应privateSystem.out.println(field.getType());//返回变量数据类型//③获取成员变量的值(注意变量为私有,所以还要用 setAccessible(true)取消检查)Student s2 = new Student("小王");field.setAccessible(true);System.out.println(field.get(s2));//四.获取成员方法的对象//①获取单个成员方法的对象Method method = aClass.getMethod("toString");//②使用获取的成员变量对象得到它的各种信息System.out.println(method.getModifiers());//返回修饰符对应的数字:1对应public,2对应privateSystem.out.println(method.getParameterCount());//返回参数个数//③方法运行(方法的调用者,还有传参invoke(Object obj, Object... args)第一个参数的方法的调用者是谁,第二个是传的参数,这个方法无参所以不传)method.setAccessible(true);String result= (String) method.invoke(s1);System.out.println(result);

相关文章:

反射简单介绍

反射就是从类里拿东西 有的人可能会想为什么不能用io流,从上往下一行一行的读也能获取类中的信息,为什么要用反射呢? 假如我们io流,从左到右一行一行的读取数据,如果碰到局部变量和成员变量同名,怎么区分&a…...

工具篇--GitHub Desktop 使用

文章目录 前言一、GitHub Desktop 的使用:1.1 通过官网下载GitHub Desktop和安装:1.2 安装和使用:1.2.1 填充自己的标识:1.2.3 克隆项目:1.2.4 git 常用忽略项配置: 二、代码的更新和提交:2.1 代…...

单臂路由配置

知识点 单臂路由指在路由器上的一个接口配置子接口(逻辑接口)来实现不同vlan间通信 路由器上的每个物理接口都可以配置多个子接口(逻辑接口) 公司的财务部、技术部和业务部有多台计算机,它们使用一台二层交换机进行互…...

河工oj第七周补题题解2024

A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …...

卷积的数学原理与作用

一、一维卷积 &#xff08;一&#xff09;定义 数学定义 给定一个输入序列 x [ x 1 , x 2 , ⋯ , x n ] x [x_1,x_2,\cdots,x_n] x[x1​,x2​,⋯,xn​] 和一个卷积核&#xff08;滤波器&#xff09; k [ k 1 , k 2 , ⋯ , k m ] k [k_1,k_2,\cdots,k_m] k[k1​,k2​,⋯,…...

路由介绍.

RIB和FIB Routing Information Base&#xff08;RIB&#xff09;&#xff0c;即路由信息库&#xff0c;是存储在路由器或联网计算机中的一个电子表格或类数据库&#xff0c;它保存着指向特定网络地址的路径信息&#xff0c;包括路径的路由度量值。RIB的主要目标是实现路由协议…...

CTFshow-命令执行(Web29-40)

CTFshow-命令执行(Web29-40) CTFWeb-命令执行漏洞过滤的绕过姿势_绕过空格过滤-CSDN博客 总结rce&#xff08;远程代码执行各种sao姿势&#xff09;绕过bypass_远程命令执行绕过-CSDN博客 对比两者的源代码&#xff0c;我们发现&#xff0c;cat指令把flag.php的内容导出后依…...

MySQL锁的类型有哪些

目录 共享锁(share lock)&#xff1a; 排他锁(exclusivelock)&#xff1a; 表锁(table lock)&#xff1a; 行锁&#xff1a; 记录锁(Record lock)&#xff1a; 页锁&#xff1a; 间隙锁&#xff1a; 基于锁的属性分类&#xff1a;共享锁&#xff0c;排他锁。 基于锁的粒…...

基于 JNI + Rust 实现一种高性能 Excel 导出方案(下篇)

衡量一个人是否幸福&#xff0c;不应看他有多少高兴的事&#xff0c;而应看他是否为小事烦扰。只有幸福的人&#xff0c;才会把无关痛痒的小事挂心上。那些真正经历巨大灾难和深重痛苦的人&#xff0c;根本无暇顾及这些小事的。因此人们往往在失去幸福之后&#xff0c;才会发现…...

关于Python程序消费Kafka消息不稳定问题的处理方法

在使用Python程序消费Kafka消息的过程中&#xff0c;有时会遇到各种不稳定的情况&#xff0c;如自动提交偏移量无效、CommitFailedError错误等。这些问题不仅影响了数据处理的可靠性&#xff0c;还可能导致重复消费或丢失消息。本文将针对这两个常见问题提供详细的解决方案和最…...

【OpenCV】Canny边缘检测

理论 Canny 边缘检测是一种流行的边缘检测算法。它是由 John F. Canny 在 1986 年提出。 这是一个多阶段算法&#xff0c;我们将介绍算法的每一个步骤。 降噪 由于边缘检测易受图像中的噪声影响&#xff0c;因此第一步是使用 5x5 高斯滤波器去除图像中的噪声。我们在前面的章…...

算法-二进制和位运算

一.二进制 &#xff08;1&#xff09;.无符号数&#xff1a; 无符号数是一种数据表示方式&#xff0c;它只表示非负整数&#xff0c;即没有符号位&#xff0c;所有的位都用来表示数值大小。在 C 等编程语言中&#xff0c;常见的无符号类型有 unsigned int、unsigned char 等。…...

OpenAI Chatgpt 大语言模型

OpenAI 一个美国人工智能研究实验室&#xff0c;由非营利组织 OpenAI Inc&#xff0c;和其营利组织子公司 OpenAI LP 所组成。该组织于 2015 年由萨姆阿尔特曼、里德霍夫曼、杰西卡利文斯顿、伊隆马斯克、伊尔亚苏茨克维、沃伊切赫萨伦巴、彼得泰尔等人在旧金山成立&#xff0…...

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用&#xff0c;前两期基本讲的差不多&#xff0c;够日常使用&#xff0c;但是有的小伙伴可能就会抱怨了&#xff0c;若是遇到业务逻辑比较复杂的sq…...

C#,人工智能,深度学习,目标检测,OpenCV级联分类器数据集的制作与《层级分类器一键生成器》源代码

一、目标识别技术概述 1、摘要 目标检测是计算机视觉中最基本和最具挑战性的问题之一&#xff0c;它试图从自然图像中的大量预定义类别中定位目标实例。深度学习技术已成为直接从数据中学习特征表示的强大策略&#xff0c;并在通用目标检测领域取得了显著突破。鉴于这一快速发…...

调度系统:Luigi 的主要特性和功能

Luigi 是一个开源的 Python 工作流管理工具&#xff0c;用于构建批处理作业管道&#xff0c;特别适用于数据工程领域。它被设计用来编排任务和处理任务间的依赖关系&#xff0c;支持自动化复杂的 ETL 流程、数据分析、模型训练等任务。 Luigi 的主要特性和功能&#xff1a; 任…...

C# 探险之旅:第二节 - 定义变量与变量赋值

欢迎再次踏上我们的C#学习之旅。今天&#xff0c;我们要聊一个超级重要又好玩的话题——定义变量与变量赋值。想象一下&#xff0c;你正站在一个魔法森林里&#xff0c;手里拿着一本空白的魔法书&#xff08;其实就是你的代码编辑器&#xff09;&#xff0c;准备记录下各种神奇…...

AUTOSAR:SOME/IP 概念

文章目录 1. 用例与需求1.1 典型用例1.2 对中间件的要求 2. 协议栈示例3. SOME/IP 概念3.1 中间件整体功能与架构3.2 服务组成元素详细解释 4. 服务发现机制深入剖析5. 总结 1. 用例与需求 1.1 典型用例 信息娱乐系统&#xff1a; 后座娱乐系统连接&#xff1a;允许后排乘客连…...

循序渐进kubenetes Service(Cluster ip、Nodeport、Loadbalancer)

文章目录 部署一个web服务Kubernetes Port ForwardKubernetes ServicesClusterIP ServiceNodePort ServiceLoadBalancer Service 部署一个web服务 准备 Kubernetes 集群后&#xff0c;创建一个名为 web 的新 namespace&#xff0c;然后在该 namespace 中部署一个简单的 web 应…...

深入理解 Apache Shiro:安全框架全解析

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在…...

【ArkTS】基础语法

一、ArkTS 语言简介 ArkTS 是一种设计用于构建高性能应用的编程语言。它在继承 TypeScript 语法的基础上进行了优化,以提供更高的性能和开发效率。 许多编程语言在设计之初未考虑移动设备,导致应用运行缓慢、低效且功耗大。随着移动设备在日常生活中越来越普遍,针对移动环境…...

teler IDS v3前瞻:eBPF技术与teler-waf集成带来的革命性变革

teler IDS v3前瞻&#xff1a;eBPF技术与teler-waf集成带来的革命性变革 【免费下载链接】teler Real-time HTTP Intrusion Detection 项目地址: https://gitcode.com/gh_mirrors/te/teler teler IDS作为一款实时HTTP入侵检测系统&#xff0c;在网络安全领域已经建立了坚…...

自建轻量CI_CD:GitHub Actions + Docker + 自动版本号 + 自动回滚 实战教程

自建轻量CI/CD&#xff1a;GitHub Actions Docker 自动版本号 自动回滚 实战教程 &#x1f3f7;️ 标签&#xff1a;CI/CD、GitHub Actions、Docker、自动化部署、自动版本号、自动回滚、DevOps &#x1f4cc; 阅读指南&#xff1a;本文手把手带你搭建一套轻量、免费、稳定的…...

【限时公开】Cuvil 0.8.3+PyTorch 2.3+Linux内核6.5组合部署黄金配置(含3个已知crash漏洞规避补丁)

第一章&#xff1a;Cuvil 编译器在 Python AI 推理中的应用 避坑指南Cuvil 是一个面向 AI 模型推理优化的轻量级编译器&#xff0c;支持将 PyTorch/TensorFlow 模型图转换为高性能、低延迟的 C 执行后端。在 Python 生态中直接集成 Cuvil 时&#xff0c;开发者常因环境兼容性、…...

STM32定时器时基单元详解:从PSC到ARR的完整配置指南(附代码)

STM32定时器时基单元实战指南&#xff1a;从寄存器配置到精准延时实现 在嵌入式开发中&#xff0c;定时器是最基础也最核心的外设之一。无论是简单的LED闪烁控制&#xff0c;还是复杂的电机PWM驱动&#xff0c;都离不开定时器的精准计时功能。对于STM32开发者来说&#xff0c;掌…...

从Stable Diffusion到多模态大模型:图文交错数据如何让AI学会‘边想边画’?

图文交错数据&#xff1a;多模态大模型实现"边想边画"的关键突破 当Stable Diffusion以惊艳的画质震惊世界时&#xff0c;人们很快发现它存在一个根本局限——这个能画出精美图像的模型&#xff0c;却无法理解自己笔下的内容。与此同时&#xff0c;擅长理解图像的多模…...

终极指南:3分钟掌握ControlNet-v1-1_fp16_safetensors高效AI图像控制

终极指南&#xff1a;3分钟掌握ControlNet-v1-1_fp16_safetensors高效AI图像控制 【免费下载链接】ControlNet-v1-1_fp16_safetensors 项目地址: https://ai.gitcode.com/hf_mirrors/comfyanonymous/ControlNet-v1-1_fp16_safetensors ControlNet-v1-1_fp16_safetensor…...

VMware Workstation 16开机自启踩坑实录:从环境变量报错到bat脚本优化,一篇搞定

VMware Workstation 16开机自启全攻略&#xff1a;从环境变量到脚本优化的深度实践 每次重启服务器后手动打开虚拟机实在是个体力活。上周我负责维护的测试环境又因为忘记启动虚拟机导致整个团队阻塞了半天&#xff0c;这种低级错误让我决定彻底解决VMware Workstation的开机自…...

超级电容matlab simulink储能模型仿真,能量管理 蓄电池充放电模型,电池-超级电容混合储能系统能量管理

超级电容matlab simulink储能模型仿真&#xff0c;能量管理 蓄电池充放电模型&#xff0c;电池-超级电容混合储能系统能量管理这是一个关于超级电容-蓄电池混合储能系统&#xff08;HESS&#xff09;能量管理策略的完整MATLAB/Simulink仿真方案。 一、系统架构与仿真模型 混合储…...

ESP32按键状态机设计:工业级去抖与多事件识别

1. ESP32-Button 库深度解析&#xff1a;面向工业级人机交互的按键状态机设计与实现1.1 工程背景与设计动因在嵌入式系统开发中&#xff0c;按键处理看似简单&#xff0c;实则暗藏诸多工程陷阱。裸写digitalRead()配合delay()的“抖动延时法”在教学Demo中尚可接受&#xff0c;…...