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

java的反射Reflect

文章目录

  • 定义
  • class
  • Class
  • 获取一个类的类对象
  • 反射的具体步骤
    • 1.加载类
      • 类API
    • 2.实例化
    • 3.获取
      • 1)获取类中方法
      • 2)获取构造方法
      • 3)获取当前类的属性
    • 4.方法调用
  • 应用
    • 1.遍历对象属性,进行赋值


定义

  • 反射是操作其属性和方法从编码期决定转为在运行期决定
    • 编码期决定:创建固定类的对象,调用这个对象的属性和方法
    • 运行期决定:灵活创建想要创建的对象(参数中传入想要创建对象的字符串),再调用这个对象的属性和方法,这样做可以提高代码的灵活度,适度使用;过度使用会降低代码的运行效率,增加资源开销。

class

  • 静态属性,class在Object中定义,所有的类都有这个静态属性。例:String.class、int.class

Class

  • 类,Class类的每个实例用于表示JVM加载的一个类

获取一个类的类对象

  1. 直接调用该类的静态属性class
Class cls=String.class;
//但是这样做是在编码期间确定获取某个类的类对象相对不灵活
  1. 调用Class的静态方法forName
Class cls=Class.formName("java.lang.String")
  1. 通过对象获取该类
Class cls=new User().getClass()
  1. 通过类加载器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.方法调用

  • 获取到属性或方法,实例化对象才能调用
  1. 属性
int a=field.getInt(Object obj)
//obj:调用该方法的所属对象
  1. 调用
Object method.invoke(Object obj, Object... args)
//obj:调用该方法的所属对象
//args:可变长参数:调用该方法传递的实际参数
  1. 无参方法的调用示例
//实例化类对象
Object obj=Test.class.newInstance()
//调用
method.invoke(obj)
  1. 有参方法的调用示例
//实例化类对象
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.遍历对象属性&#xff0c;进行赋值定义 反射是操作其属性和方法从编码期决定转为在运行期决定 编码期决定&#xff1a;创…...

常用设计模式总结

复习到设计模式的时候写的一些demo代码 回头可以看看 单例的几种比较简单就没写了&#xff0c;专栏有 目录 观察者&#xff08;发布--订阅模式&#xff09;模式&#xff0c;多个对象依赖于一个对象&#xff0c;或者多对多 工厂模式&#xff1a;主要是封装了对象的创建&…...

【算法基础】一维前缀和 + 二维前缀和

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…...

Kafka消费分组和分区分配策略

Kafka消费分组&#xff0c;消息消费原理 同一个消费组里的消费者不能消费同一个分区&#xff0c;不同消费组的消费组可以消费同一个分区 &#xff08;即同一个消费组里面的消费者只能在一个分区中&#xff09; Kafka分区分配策略 问题 用过 Kafka 的同学用过都知道&#xf…...

犹太教、基督教、伊斯兰教的区别与联系

一、犹太教、基督教、伊斯兰教的简明关系图二、犹太教、基督教、伊斯兰教的主要区别注&#xff1a;弥赛亚&#xff08;希伯莱语&#xff09;就是基督&#xff08;希腊语&#xff09;&#xff0c;意思是“救世主”。注&#xff1a;伊斯兰教的观点是&#xff1a;穆罕默德不是伊斯…...

华为OD机试 - 打印文件(Python) | 机试题+算法思路+考点+代码解析 【2023】

打印文件 题目 有 5 台打印机打印文件,每台打印机有自己的待打印队列。 因为打印的文件内容有轻重缓急之分,所以队列中的文件有1~10不同的优先级,其中数字越大优先级越高。 打印机会从自己的待打印队列中选择优先级最高的文件来打印。 如果存在两个优先级一样的文件,则选…...

网络工程师必备知识点

作为网络工程师&#xff0c;您将负责设计、部署和维护计算机网络系统。这包括构建、配置和管理网络设备&#xff0c;如交换机、路由器、防火墙等&#xff0c;并确保网络系统能够高效地运行。您需要了解计算机网络的各个层次、协议、标准和技术&#xff0c;包括TCP/IP、DNS、HTT…...

数据在内存中的存储【下篇】

文章目录⚙️3.浮点型在内存中的存储&#x1f529;3.1.一个例子&#x1f529;3.2.浮点数的存储规则&#x1f529;3.3.例题解析⚙️3.浮点型在内存中的存储 &#x1f529;3.1.一个例子 &#x1f534;浮点数存储的例子&#xff1a;&#x1f447; int main() {int n 9;float* …...

前端开发项目规范写法介绍

1. 基本原则 结构、样式、行为分离 尽量确保文档和模板只包含 HTML 结构,样式都放到样式表里,行为都放到脚本里。 缩进 统一两个空格缩进(总之缩进统一即可),不要使用 Tab 或者 Tab、空格混搭。 文件编码 使用不带 BOM 的 UTF-8 编码。 在 HTML中指定编码 <meta c…...

百万医疗险是什么

一、百万医疗险是什么 从名字可以看出&#xff0c;这是一款医疗险。因为保额高&#xff0c;最高能报销百万&#xff0c;所以叫百万医疗险。 二、百万医疗险有什么用 可以报销被保险人因意外伤害和疾病导致的医疗费用 三、如何挑选 虽然高达几百万的保额&#xff0c;但保额却并非…...

矩阵中的路径 AcWing (JAVA)

请设计一个函数&#xff0c;用来判断在一个矩阵中是否存在一条路径包含的字符按访问顺序连在一起恰好为给定字符串。 路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&#xff0c;向上&#xff0c;向下移动一个格子。 如果一条路径经过…...

使用终端工具给你的电脑发送弹窗提醒

大家好&#xff0c;我是良许。 现在人手一部智能手机&#xff0c;这些智能手机都有个非常实用的功能&#xff0c;那就是弹窗提醒。当我们收到短信&#xff0c;或者微信信息时&#xff0c;手机就会弹窗显示信息的大致内容。有了这个功能你就不会错过重要信息了。 电脑上也有类…...

SpringCloud Alibaba 之Nacos集群部署-高可用保证

文章目录Nacos集群部署Linux部署docker部署&#xff08;参考待验证&#xff09;Nacos 集群的工作原理Nacos 集群中 Leader 节点是如何产生的Nacos 节点间的数据同步过程官方推荐用户把所有服务列表放到一个vip下面&#xff0c;然后挂到一个域名下面。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,今年停止更新~

大家好&#xff0c;这里是程序员晚枫。 今天给大家分享一个来自Python官网的重要消息&#xff1a;Python3.7马上就要停止维护了&#xff0c;请不要使用了&#xff01; 官网链接&#xff1a;https://devguide.python.org/versions/ 停更的后果是什么&#xff1f; 周末翻阅Py…...

C# 业务单据号生成器(定义规则、获取编号、流水号)

系列文章 C#底层库–数据库访问帮助类&#xff08;MySQL版&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/126886379 C#底层库–JSON帮助类_详细&#xff08;序列化、反序列化、list、datatable&#xff09; 本文链接&#xff1a;htt…...

Java的dump文件分析及JProfiler使用

Java的dump文件分析及JProfiler使用 1 dump文件介绍 从软件开发的角度上&#xff0c;dump文件就是当程序产生异常时&#xff0c;用来记录当时的程序状态信息&#xff08;例如堆栈的状态&#xff09;,用于程序开发定位问题。 idea配置发生OOM的时候指定路径生成dump文件 # 指定…...

sympy高斯光束模型

文章目录Gauss模型sympy封装实战sympy.phisics.optics.gaussopt集成了高斯光学中的常见对象&#xff0c;包括光线和光学元件等&#xff0c;有了这些东西&#xff0c;就可以制作一个光学仿真系统。Gauss模型 高斯光束的基本模型为 E(r,z)E0ω0ω(z)exp⁡[−r2ω2(z)]exp⁡[−ik…...

Cloudflared 内网穿透 使用记录

Cloudflared 内网穿透前提创建cloudflared tunnel我使用的服务前提 你必须要有一个域名&#xff0c;并且可以改域名的dns解析服务商到cloudflare 1.登录到cloudflare后台&#xff0c;点击添加站点 2.输入自己的域名&#xff0c;下一步选择免费套餐 3.他会搜索这个域名下已有…...

柴油发电机组的调压板

1 概述 柴油发电机组的调压板是一种用于控制发电机输出电压的装置。它通常由一块电子电路板和一个电子电路板上的电位器组成。 当发电机运行时&#xff0c;它会产生电压&#xff0c;然后通过调压板中的电路进行控制。调压板中的电路会检测输出电压的大小&#xff0c;并通过电…...

【MySQL】表操作和库操作

文章目录概念库操作1.创建数据库2.删除数据库3.选择数据库4.显示数据库列表表操作1.创建数据表CREATE2.删除数据表DROP3.插入数据INSERT4.更新数据UPDATE5.修改数据ALTER6.查询数据SELECT7.WHERE子句8.ORDER BY子句9.LIMIT子句10.GROUP BY子句11.HAVING子句使用注意事项概念 M…...

拓扑排序的思想?用代码怎么实现

目录 一、拓扑排序的思想 二、代码实现&#xff08;C&#xff09; 代码思想 核心代码 完整代码 一、拓扑排序的思想 以西红柿炒鸡蛋这道菜为例&#xff0c;其中的做饭流程为&#xff1a; 中间2 6 3 7 4的顺序都可以任意调换&#xff0c;但1和5必须在最前面&#xff0c;这是…...

【Git】码云

目录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 6.1 创建远程仓库 6.2 远程仓库操作 6.3 SSH 免密登录 5、 Git 团队协作机制 5.1 团队内协作 5.2 跨团队协作 6、 Gitee码云 操作 码云网址&#xff1a; https://githee.com/ 账号验证…...

数据结构与算法(三):栈与队列

上一篇《数据结构与算法&#xff08;二&#xff09;&#xff1a;线性表》中介绍了数据结构中线性表的两种不同实现——顺序表与链表。这一篇主要介绍线性表中比较特殊的两种数据结构——栈与队列。首先必须明确一点&#xff0c;栈和队列都是线性表&#xff0c;它们中的元素都具…...

Spring架构篇--2.5.2 远程通信基础Select 源码篇--window--sokcet.register

前言&#xff1a;通过Selector.open() 获取到Selector 的选择器后&#xff0c;服务端和客户的socket 都可以通过register 进行socker 的注册&#xff1b; 服务端 ServerSocketChannel 的注册&#xff1a; ServerSocketChannel serverSocketChannel ServerSocketChannel.open(…...

ISIS协议

ISIS协议基础简介应用场景路由计算过程地址结构路由器分类邻居Hello报文邻居关系建立DIS及DIS与DR的类比链路状态信息的载体链路状态信息的交互路由算法网络分层路由域![在这里插入图片描述](https://img-blog.csdnimg.cn/9027c43b614a4399ae1f54e87a37f047.png)区域间路由简介…...

CRM系统哪种品牌的好?这五款简单好用!

CRM系统哪种品牌的好&#xff1f;这五款简单好用&#xff01; CRM系统是指利用软件、硬件和网络技术&#xff0c;为企业建立一个客户信息收集、管理、分析和利用的信息系统。CRM系统的基础功能主要包括营销自动化、客户管理、销售管理、客服管理、报表分析等&#xff0c;选择合…...

QT_dbus(ipc进程间通讯)

QT_dbus(ipc进程间通讯) 前言&#xff1a; 参考链接&#xff1a; https://www.cnblogs.com/brt3/p/9614899.html https://blog.csdn.net/weixin_43246170/article/details/120994311 https://blog.csdn.net/kchmmd/article/details/118605315 一个大型项目可能需要多个子程序同…...

华为OD机试 - 数组排序(C++) | 附带编码思路 【2023】

刷算法题之前必看 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:https://blog.csdn.net/hihell/category_12199283.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 华为OD机试题…...

字符串转换为二进制-课后程序(JAVA基础案例教程-黑马程序员编著-第五章-课后作业)

【案例5-4】 字符串转换为二进制 【案例介绍】 1.任务描述 本例要求编写一个程序&#xff0c;从键盘录入一个字符串&#xff0c;将字符串转换为二进制数。在转换时&#xff0c;将字符串中的每个字符单独转换为一个二进制数&#xff0c;将所有二进制数连接起来进行输出。 案…...