Java反射详解
Java反射
一.什么是反射
我们使用的一些像框架,tomcat,或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性。这是如何做到的?
当他们加载我们本地的类时,需要先创建对象,然后将查询到的结果封装到创建的对象中(调用setxxx()方法,调用xxx属性),但问题是框架只知道Student类的地址,它是如何使用类的?
框架只能根据配置文件中配置的类的地址决定要创建并操作哪个类:
<select id="findStudents" parameterType="Student" resultType="xx.xx.xx.Student">
而且框架要做到可以处理任何类,只需要一套程序来处理,这是怎么办到的?
这时候我们就需要反射机制,只用一套程序来解决框架处理任何类的问题。
反射:
JAVA反射机制是再运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对西昂,都能调用它的任意一个方法和属性,这种动态获取信息以及动态调用对西昂的方法的功能称为java语言的反射机制。它的作用就是动态获取类的信息。
二.Class类:
反射机制当中有一个类叫Class,Class类的类表示正在运行的Java应用程序中的类和接口。
一旦class文件被加载到内存,就会为其创建一个Class对象,任何类被使用时都会创建一个Class对象。
Class类是Java反射机制的基础,可以通过获取类的Class类,可以得到一个类的基本信息。
那么如何获得类的Class对象?
方式1:
String s="Model.User";Class c1=Class.forName(s); //把给定地址的类进行了加载,为其创建Class对象Class c2=Class.forName(s); //把给定地址的类进行了加载,为其创建Class对象System.out.println(c1);System.out.println(c2);System.out.println(c1==c2); //true:c1和c2表示的是同一个//通过user的Class对象,就看可以获得User类的基本信息
方式2:
Class c3= User.class;
方式3:
User user=new User();Class c4=user.getClass(); //通过已知的对象中的getClass() 获得该对象类的Class对象
那么成功获取对象类的Class对象后如何取得其中相关信息呢?
1.创建对象
//通过Class类的对象,来创建User对象//newInstance调用默认无参构造方法,所以如果类中有有参构造方法还需要单独把无参构造方法也写出来否则IllegalAccessExceptionObject objectUser=c.newInstance();
2.获取类中的构造方法信息
//类中要确保有无参构造方法否则异常NoSuchMethodExceptionConstructor constructor1=c.getConstructor(); //获得类中指定的公共public构造方法Object objectUser = constructor1.newInstance(); //通过构造方法中newInstance创建对象Constructor constructor2=c.getDeclaredConstructor(); //获得类中的指定沟构造方法(包括私有)Constructor constructor3=c.getConstructor(String.class,String.class); //获得公共的有参构造方法Object objectUser1=constructor3.newInstance("用户1","密码1"); //创建对象,并为对象属性复制Constructor[] constructors=c.getConstructors(); //获得所有的公共的构造方法c.getDeclaredConstructors(); //获得包括私有的所有的构造方法
小知识点:java创建对象三种方式:
(1)new (2)反射机制的newInsteance (3)序列化与反序列化读取文件中的类
3.获得成员变量
String s="Model.User";Class c=Class.forName(s); //获得类的Class对象Object objectUser=c.newInstance(); //创建User对象//获得类中的成员变量//获得类中指定的公共的属性,把属性封装到一个Field对象// Field userNameField = c.getField("userName");Field userNameField = c.getDeclaredField("userName"); //私有成员变量//获得所有的属性Field [] fields=c.getFields();//包括私有Field [] fields1=c.getDeclaredFields();//用HashMap模拟查询到的数据HashMap<String,String> map=new HashMap<>();map.put("userName","admin");map.put("password","123456");//循环所有的属性,为属性赋值for (Field f: fields) {//打破了封装性,!慎用,建议使用getset方法因为可能setget方法中还有逻辑语句f.setAccessible(true); //设置可以访问私有属性f.set(objectUser,map.get(f.getName()));}
4.获得方法
String s="Model.User";Class c=Class.forName(s); //获得类的Class对象Object objectUser=c.newInstance(); //创建User对象Method eat1=c.getMethod("eat");//执行objectUser对象中的无参eat方法——invoke:调用eat1.invoke(objectUser);Method eat2=c.getMethod("eat",String.class);eat2.invoke(objectUser,"参数");//包括继承的方法Method[] methods1=c.getMethods();//获得本类中所有的成员方法包括私有Method[] methods2=c.getDeclaredMethods();System.out.println(methods1.length); //15System.out.println(methods2.length); //7Field[] fields=c.getDeclaredFields(); //获得所有属性for (Field f:fields) { //循环拿到每一个属性//通过属性名 匹配到getset方法String set="set"+String.valueOf(f.getName().charAt(0)).toUpperCase()+f.getName().substring(1);Method setMethod=c.getMethod(set,String.class); //通过set方法名获得set方法setMethod.invoke(objectUser,"用户和密码"); //调用set方法}
相关文章:
Java反射详解
Java反射 一.什么是反射 我们使用的一些像框架,tomcat,或者一些其他的组件(jackson 对象–>json)。他们可以做到给他什么类名,就可以创建给定类的对象,并调用该对象的方法和属性。这是如何做到的? 当他们加载我们…...
Spring Boot与Apache Kafka集成的深度指南
Spring Boot与Apache Kafka集成的深度指南 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代分布式系统中,消息队列的作用愈发重要࿰…...

甄选版“论软件系统架构评估”,软考高级论文,系统架构设计师论文
论文真题 对于软件系统,尤其是大规模的复杂软件系统来说,软件的系统架构对于确保最终系统的质量具有十分重要的意义,不恰当的系统架构将给项目开发带来高昂的代价和难以避免的灾难。对一个系统架构进行评估,是为了:分析现有架构存在的潜在风险,检验设计中提出的质量需求,…...

uniapp开发企业微信内部应用
最近一直忙着开发项目,终于1.0版本开发完成,抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品,公司扩展业务,需要在企业微信中开发内部应用。因为工作中使用的是钉钉,很少使用企业微信,对于…...
0122__linux之eventfd理解
linux之eventfd理解-CSDN博客 Linux fd 系列 — eventfd 是什么?-CSDN博客...
数学建模 —— 查找数据
目录 百度搜索技巧 完全匹配搜索:查询词的外边加上双引号“ ” 标题必含关键词:查询词前加上intitle: 搜索文档:空格再输入filetype:文件格式 去掉不想要的:查询词后面加空格后加减号与关键字 知网查文献 先看知网的硕博士…...

合并有序链表
合并有序链表 图解代码如下 图解 虽然很复杂,但能够很好的理解怎么使用链表,以及对链表的指针类理解 代码如下 Node* merge_list_two_pointer(List& list1, List& list2) {Node* new_head1 list1.head;Node* new_head2 list2.head;Node* s…...
【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库
不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,微信:xxh_1459,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了…...

Spark基于DPU的Native引擎算子卸载方案
1.背景介绍 Apache Spark(以下简称Spark)是一个开源的分布式计算框架,由UC Berkeley AMP Lab开发,可用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习&a…...
Mini2440 start.s 修改支持串口输出,方便调试 (四)
经常会遇到点板子的时候,板子没有任何反应!怎么知道板子有没有在正常启动,在uboot阶段 start.s 中加入串口打印信息是很有必要的! 输出串口信息 ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoo…...

【教程】几种不同的RBF神经网络
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…...

【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx
【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载: https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括…...

【Java笔记】Flyway数据库管理工具的基本原理
文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理,顺便了解了下基本原理,做个记录。 详细的使用就不写了,网上教程很多…...

国际数字影像产业园创业培训,全面提升创业能力!
国际数字影像产业园作为数字影像产业的创新高地,致力于提供全面的创业支持服务。其中,创业培训作为重要的组成部分,旨在通过系统的课程设置和专业的讲师团队,为创业者提供从基础到进阶的全方位指导,帮助他们在数字影像…...

pyqt5 制作视频剪辑软件,切割视频
该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到…...
VUE----通过nvm管理node版本
使用 NVM(Node Version Manager)来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤: 1. 安装 NVM 如果你还没有安装 NVM,可以按照以下步骤进行安装:…...
R语言进行字符的替换和删减gsub,substr函数
目录 R语言读文件“-“变成“.“ 提取列字符前几个 提取列字符末尾几个 进行字母替换 paste0函数使用 长宽数据转换 R语言读文件“-“变成“.“ R语言读文件“-“变成“.“_r语言 列名中的-变成了点-CSDN博客 怎样将"."还原为"-" rm(list = ls()…...

2024年6月27日,欧盟REACH法规新增第31批1项SVHC高关注物质
ECHA公布第31批1项SVHC,物质已增至241项 2024年6月27日,ECHA公布第31批1项SVHC,总数达241项。新增物质未包括磷酸三苯酯,仍在评议中。REACH法规要求SVHC含量超0.1%需告知下游,出口超1吨须通报ECHA。SCIP通报要求SVHC含…...

高通410-linux棒子设置网络驱动
1.首先打开设备管理器 2.看到其他设备下的RNDIS,右键更新驱动程序 3.点击浏览我的电脑… 最后一个...
PostgreSQL的系统视图pg_stat_archiver
PostgreSQL的系统视图pg_stat_archiver 在 PostgreSQL 数据库中,pg_stat_archiver 视图提供了关于归档进程(archiver process)的统计信息。归档进程负责将 WAL(Write-Ahead Logging)日志文件复制到归档存储࿰…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...