java的反射Reflect
文章目录
- 定义
- class
- Class
- 获取一个类的类对象
- 反射的具体步骤
- 1.加载类
- 类API
- 2.实例化
- 3.获取
- 1)获取类中方法
- 2)获取构造方法
- 3)获取当前类的属性
- 4.方法调用
- 应用
- 1.遍历对象属性,进行赋值
定义
- 反射是操作其属性和方法从编码期决定转为在运行期决定
- 编码期决定:创建固定类的对象,调用这个对象的属性和方法
- 运行期决定:灵活创建想要创建的对象(参数中传入想要创建对象的字符串),再调用这个对象的属性和方法,这样做可以提高代码的灵活度,适度使用;过度使用会降低代码的运行效率,增加资源开销。
class
- 静态属性,class在Object中定义,所有的类都有这个静态属性。例:
String.class、int.class
Class
- 类,Class类的每个实例用于表示JVM加载的一个类
获取一个类的类对象
- 直接调用该类的静态属性class
Class cls=String.class;
//但是这样做是在编码期间确定获取某个类的类对象相对不灵活
- 调用Class的静态方法forName
Class cls=Class.formName("java.lang.String")
- 通过对象获取该类
Class cls=new User().getClass()
- 通过类加载器ClassLoader
InputStream=getClass()(或类名.class).getClassLoader().getResourceAsStream(fileName)
//类加载器加载文件默认会从工程的resources文件夹下查找
反射的具体步骤
- 一般分为4步:加载类、实例化、获取、调用
1.加载类
Class cls=Class.forName("类的全称")
//若指定的类完全限定名有误时,会抛出异常:ClassNotFoundException
类API
String cls.getName()//类的全称
String cls.getPackage().getName()//包名
String cls.getSimpleName()//类名
String cls.getSuperclass().getSimpleName()//父类//类上所有注解
Annotation[] cls.getAnnotations()
//获取类上指定注解
RequestMapping cls.getAnnotation(RequestMapping.class);
2.实例化
Object cls.newInstance()
//例如Test test=(Test)Class.forName("com.sgp.Test").newInstance()
//本质是调用其表示的类的无参构造方法进行实例化,并将实例化的对象返回,也是创建对象的方式之一
3.获取
1)获取类中方法
Method[] cls.getMethods()//所有公有方法
Method cls.getMethod(String name, Class<?>... parameterTypes)//指定公有方法Method[] cls.getDeclaredMethods()//所有方法
Method method=cls.getDeclaredMethod("方法名", null)//指定方法
//例如cls.getDeclaredMethod("sayHi", String.class,int.class)
//第二个参数是可变长参数:是指这个方法的几个参数对应的参数类型的class静态属性,无参为null或者不写method.getName()//方法名
Params params = method.getAnnotation(Params.class)//方法上的注解
Class[] method.getParameterTypes()//方法中参数 //参数个数:数组的length
2)获取构造方法
Constructor co=cls.getConstructor(int.class)//指定构造
Constructor[] con=cls.getConstructors()//所有构造
3)获取当前类的属性
Field[] fields=cls.getFields()//全部公有属性
Field field=cls.getField("a")//指定公有属性Field[] fields = cls.getDeclaredFields()//全部属性
Field field = cls.getDeclaredField("code")//指定属性String field.getName()//属性名
String field.getType().getName()//属性类型
Column column = field.getAnnotation(Column.class)//属性上的指定注解
4.方法调用
- 获取到属性或方法,实例化对象才能调用
- 属性
int a=field.getInt(Object obj)
//obj:调用该方法的所属对象
- 调用
Object method.invoke(Object obj, Object... args)
//obj:调用该方法的所属对象
//args:可变长参数:调用该方法传递的实际参数
- 无参方法的调用示例
//实例化类对象
Object obj=Test.class.newInstance()
//调用
method.invoke(obj)
- 有参方法的调用示例
//实例化类对象
Object obj=Test.class.newInstance()
//遍历每个方法时,获得方法的参数类型
Class[] types=method.getParameterTypes()//如果types.length==0,说明该方法不带参
//创建一个数组,用来存放参数值
Object[] params=new Object[types.length]
//判断参数类型,并往数组中存放值
for(int i=0;i<types.length;i++){if(types[i]==String.class){params[i]="hello"}if(types[i]==int.class) {params[i]=100}
}
//执行该方法,将装参数的数组作为参数传进去Object method.invoke(obj,params)
应用
1.遍历对象属性,进行赋值
Class cls=obj.getClass();
Field[] fields = cls.getDeclaredFields();
for(Field field:fields){String fieldName=field.getName();//排除附加字段if(fieldName.contains("serialVersionUID") || fieldName.contains("create") || fieldName.contains("update")){continue;}//set、get时属性首字母大写fieldName=(fieldName.substring(0,1).toUpperCase())+fieldName.substring(1);//调用get方法Method getMethod = cls.getMethod("get"+fieldName);//获取属性的类型String type = field.getGenericType().toString();//如果type是类类型,则前面包含"class ",后面跟类名if(type.equals("class java.lang.String")){String value = (String) getMethod.invoke(obj);if(value==null){continue;}if(value.equalsIgnoreCase("N/A")){//执行set方法Method setMethod = cls.getMethod("set"+fieldName,new Class[] {String.class});setMethod.invoke(obj,new Object[] {null});}}
}
相关文章:
java的反射Reflect
文章目录定义classClass获取一个类的类对象反射的具体步骤1.加载类类API2.实例化3.获取1)获取类中方法2)获取构造方法3)获取当前类的属性4.方法调用应用1.遍历对象属性,进行赋值定义 反射是操作其属性和方法从编码期决定转为在运行期决定 编码期决定:创…...
常用设计模式总结
复习到设计模式的时候写的一些demo代码 回头可以看看 单例的几种比较简单就没写了,专栏有 目录 观察者(发布--订阅模式)模式,多个对象依赖于一个对象,或者多对多 工厂模式:主要是封装了对象的创建&…...
【算法基础】一维前缀和 + 二维前缀和
👦个人主页:Weraphael ✍🏻作者简介:目前正在学习c和算法 ✈️专栏:【C/C】算法 🐋 希望大家多多支持,咱一起进步!😁 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…...
Kafka消费分组和分区分配策略
Kafka消费分组,消息消费原理 同一个消费组里的消费者不能消费同一个分区,不同消费组的消费组可以消费同一个分区 (即同一个消费组里面的消费者只能在一个分区中) Kafka分区分配策略 问题 用过 Kafka 的同学用过都知道…...
犹太教、基督教、伊斯兰教的区别与联系
一、犹太教、基督教、伊斯兰教的简明关系图二、犹太教、基督教、伊斯兰教的主要区别注:弥赛亚(希伯莱语)就是基督(希腊语),意思是“救世主”。注:伊斯兰教的观点是:穆罕默德不是伊斯…...
华为OD机试 - 打印文件(Python) | 机试题+算法思路+考点+代码解析 【2023】
打印文件 题目 有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选…...
网络工程师必备知识点
作为网络工程师,您将负责设计、部署和维护计算机网络系统。这包括构建、配置和管理网络设备,如交换机、路由器、防火墙等,并确保网络系统能够高效地运行。您需要了解计算机网络的各个层次、协议、标准和技术,包括TCP/IP、DNS、HTT…...
数据在内存中的存储【下篇】
文章目录⚙️3.浮点型在内存中的存储🔩3.1.一个例子🔩3.2.浮点数的存储规则🔩3.3.例题解析⚙️3.浮点型在内存中的存储 🔩3.1.一个例子 🔴浮点数存储的例子:👇 int main() {int n 9;float* …...
前端开发项目规范写法介绍
1. 基本原则 结构、样式、行为分离 尽量确保文档和模板只包含 HTML 结构,样式都放到样式表里,行为都放到脚本里。 缩进 统一两个空格缩进(总之缩进统一即可),不要使用 Tab 或者 Tab、空格混搭。 文件编码 使用不带 BOM 的 UTF-8 编码。 在 HTML中指定编码 <meta c…...
百万医疗险是什么
一、百万医疗险是什么 从名字可以看出,这是一款医疗险。因为保额高,最高能报销百万,所以叫百万医疗险。 二、百万医疗险有什么用 可以报销被保险人因意外伤害和疾病导致的医疗费用 三、如何挑选 虽然高达几百万的保额,但保额却并非…...
矩阵中的路径 AcWing (JAVA)
请设计一个函数,用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。 如果一条路径经过…...
使用终端工具给你的电脑发送弹窗提醒
大家好,我是良许。 现在人手一部智能手机,这些智能手机都有个非常实用的功能,那就是弹窗提醒。当我们收到短信,或者微信信息时,手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。 电脑上也有类…...
SpringCloud Alibaba 之Nacos集群部署-高可用保证
文章目录Nacos集群部署Linux部署docker部署(参考待验证)Nacos 集群的工作原理Nacos 集群中 Leader 节点是如何产生的Nacos 节点间的数据同步过程官方推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。http://nacos.com:port/ope…...
Scala集合详解(第七章:集合、数组、列表、set集合、map集合、元组、队列、并行)(尚硅谷笔记)
集合第七章:集合7.1 集合简介7.1.1 不可变集合继承图7.1.2 可变集合继承图7.2 数组7.2.1 不可变数组7.2.2 可变数组7.2.3 不可变数组与可变数组的转换7.2.4 多维数组7.3 列表 List7.3.1 不可变 List7.3.2 可变 ListBuffer7.4 Set 集合7.4.1 不可变 Set7.4.2 可变 mutable.Set7.…...
定了:Python3.7,今年停止更新~
大家好,这里是程序员晚枫。 今天给大家分享一个来自Python官网的重要消息:Python3.7马上就要停止维护了,请不要使用了! 官网链接:https://devguide.python.org/versions/ 停更的后果是什么? 周末翻阅Py…...
C# 业务单据号生成器(定义规则、获取编号、流水号)
系列文章 C#底层库–数据库访问帮助类(MySQL版) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/126886379 C#底层库–JSON帮助类_详细(序列化、反序列化、list、datatable) 本文链接:htt…...
Java的dump文件分析及JProfiler使用
Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上,dump文件就是当程序产生异常时,用来记录当时的程序状态信息(例如堆栈的状态),用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…...
sympy高斯光束模型
文章目录Gauss模型sympy封装实战sympy.phisics.optics.gaussopt集成了高斯光学中的常见对象,包括光线和光学元件等,有了这些东西,就可以制作一个光学仿真系统。Gauss模型 高斯光束的基本模型为 E(r,z)E0ω0ω(z)exp[−r2ω2(z)]exp[−ik…...
Cloudflared 内网穿透 使用记录
Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名,并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台,点击添加站点 2.输入自己的域名,下一步选择免费套餐 3.他会搜索这个域名下已有…...
柴油发电机组的调压板
1 概述 柴油发电机组的调压板是一种用于控制发电机输出电压的装置。它通常由一块电子电路板和一个电子电路板上的电位器组成。 当发电机运行时,它会产生电压,然后通过调压板中的电路进行控制。调压板中的电路会检测输出电压的大小,并通过电…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
