干货分享之反射笔记
入门级笔记-反射
- 一、利用反射破泛型集合
- 二、Student类
- 三、获取构造器的演示和使用
- 1.getConstructors只能获取当前运行时类的被public修饰的构造器
- 2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器
- 3.获取指定的构造器
- 3.1得到空构造器
- 3.2得到两个参数的有参构造器:
- 3.3得到一个参数的有参构造器:并且是private修饰的
- 4.有了构造器以后我就可以创建对象
- 四、获取属性的演示和使用:
- 1.getFields:获取运行时类和父类中被public修饰的属性
- 2.getDeclaredFields:获取运行时类中的所有属性
- 3.获取指定的属性:
- 4.属性的具体结构
- 4.1获取修饰符
- 4.2获取属性的数据类型:
- 4.3获取属性的名字:
- 4.4给属性赋值:(给属性设置值,必须要有对象)
- 五、获取方法的演示与应用
- 1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)
- 2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!
- 3.获取指定的方法:
- 4.调用方法:
- 六、获取运行时类的接口
- 总结
一、利用反射破泛型集合
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {//用反射来破泛型集合/*** 泛型集合:限制存入集合中的变量类型* 但是这种限制,只出现在编码/编译期。* 运行期是没有泛型;反射,恰好就是在运行期执行*/ArrayList<String> list = new ArrayList<>();list.add("123");Class cls = ArrayList.class;Method add = cls.getMethod("add", Object.class);add.invoke(list,34);add.invoke(list,false);System.out.println(list);//运行期无泛型}
运行结果:
二、Student类
public class Student extends Person implements MyInterface {private int sno;//学号double height;//身高protected double weight;//体重public double score;//成绩public String banji;public String showInfo(){return "我是一名三好学生";}public String showInfo(int a,int b){return "重载方法====我是一名三好学生";}private void work(){System.out.println("我以后会找工作-->成为码农 程序员 程序猿 程序媛");}void happy(){System.out.println("做人最重要的就是开心每一天");}protected int getSno(){return sno;}@Overridepublic void myMethod() {System.out.println("我重写了myMethod方法。。");}public Student() {}public Student(int sno) {this.sno = sno;}public Student(int sno, double weight) {this.sno = sno;this.weight = weight;}private Student(double height) {this.height = height;}public Student(int sno, double height, double weight, double score) {this.sno = sno;this.height = height;this.weight = weight;this.score = score;}@Overridepublic String toString() {return "Student{" +"sno=" + sno +", height=" + height +", weight=" + weight +", score=" + score +'}';}
}
三、获取构造器的演示和使用
//获取字节码信息:Class cls = Student.class;//通过字节码信息可以获取构造器:
1.getConstructors只能获取当前运行时类的被public修饰的构造器
代码如下(示例):
Constructor[] c1 = cls.getConstructors();for(Constructor c:c1){System.out.println(c);}
运行结果:
2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器
代码如下(示例):
Constructor[] c2 = cls.getDeclaredConstructors();for(Constructor c:c2){System.out.println(c);}
运行结果:
3.获取指定的构造器
3.1得到空构造器
Constructor con1 = cls.getConstructor();System.out.println(con1);
运行结果:
3.2得到两个参数的有参构造器:
Constructor con2 = cls.getConstructor(int.class, double.class);System.out.println(con2);
运行结果:
3.3得到一个参数的有参构造器:并且是private修饰的
Constructor con3 = cls.getDeclaredConstructor(int.class);System.out.println(con3);
运行结果:
4.有了构造器以后我就可以创建对象
Object o1 = con1.newInstance();System.out.println(o1);Object o2 = con2.newInstance(180120111, 170.6);System.out.println(o2);
运行结果:
四、获取属性的演示和使用:
//获取字节码信息Class cls = Student.class;
1.getFields:获取运行时类和父类中被public修饰的属性
Field[] fields = cls.getFields();for(Field f:fields){System.out.println(f);}
运行结果:
2.getDeclaredFields:获取运行时类中的所有属性
Field[] declaredFields = cls.getDeclaredFields();for(Field f:declaredFields){System.out.println(f);}
运行结果:
3.获取指定的属性:
Field score = cls.getField("score");System.out.println(score);Field sno = cls.getDeclaredField("sno");System.out.println(sno);
运行结果:
4.属性的具体结构
4.1获取修饰符
//获取指定的属性:Field score = cls.getField("score");System.out.println(score);Field sno = cls.getDeclaredField("sno");System.out.println(sno);System.out.println("---------------------");
// //属性的具体结构:
// //获取修饰符/*int modifiers = sno.getModifiers();System.out.println(modifiers);System.out.println(Modifier.toString(modifiers));*/System.out.println(Modifier.toString(sno.getModifiers()));
运行结果:
这里先要获取到一个属性,再去获取属性的修饰符
4.2获取属性的数据类型:
Class clazz = sno.getType();System.out.println(clazz.getName());System.out.println("---------------------");
运行结果:
这里要接着上面的写
4.3获取属性的名字:
String name = sno.getName();System.out.println(name);System.out.println("-------------------------------");
运行结果:
4.4给属性赋值:(给属性设置值,必须要有对象)
Field sco = cls.getField("score");Object obj = cls.newInstance();sco.set(obj,98);//给obj这个对象的score属性设置具体的值,这个值为98System.out.println(obj);
运行结果:
五、获取方法的演示与应用
//获取字节码信息Class cls = Student.class;
1.getMethods:获取运行时类的方法还有所有父类中的方法(被public修饰)
Method[] methods = cls.getMethods();for(Method m:methods){System.out.println(m);}System.out.println("-----------------------");
运行结果:
2.getDeclaredMethods:获取运行时类中的所有方法:常用!!!!!
Method[] declaredMethods = cls.getDeclaredMethods();for(Method m:declaredMethods){System.out.println(m);}System.out.println("-----------------------");
运行结果:
3.获取指定的方法:
Method showInfo1 = cls.getMethod("showInfo");System.out.println(showInfo1);Method showInfo2 = cls.getMethod("showInfo", int.class, int.class);System.out.println(showInfo2);Method work = cls.getDeclaredMethod("work");work.setAccessible(true);//!!!这里是个重点暴力破拆私有--调用.setAccessible方法System.out.println(work);System.out.println("-----------------------");
运行结果:
4.调用方法:
Object o = cls.newInstance();myMethod.invoke(o);//调用o对象的mymethod方法work.invoke(o);//调用o对象的work方法
运行结果:
六、获取运行时类的接口
public static void main(String[] args) {//获取字节码信息:Class cls = Student.class;//获取运行时类的接口:Class[] interfaces = cls.getInterfaces();for(Class c:interfaces){System.out.println(c);}//得到父类的接口://先得到父类的字节码信息:Class superclass = cls.getSuperclass();//得到接口:Class[] interfaces1 = superclass.getInterfaces();for(Class c:interfaces1){System.out.println(c);}//获取运行时类所在的包:Package aPackage = cls.getPackage();System.out.println(aPackage);System.out.println(aPackage.getName());//获取运行类的注解:Annotation[] annotations = cls.getAnnotations();for(Annotation a:annotations){System.out.println(a);}}
运行结果:
总结
以上就是今天要分享的内容,干货满满,其中有一个重点!在获取指定的私有方法时候,暴力破拆私有的权限,要不然后面调用这个方法会报错,利用.setAccessible(true)方法实现,看完了的话点个收藏吧,防止用的时候找不到。
相关文章:

干货分享之反射笔记
入门级笔记-反射 一、利用反射破泛型集合二、Student类三、获取构造器的演示和使用1.getConstructors只能获取当前运行时类的被public修饰的构造器2.getDeclaredConstructors:获取运行时类的全部修饰符的构造器3.获取指定的构造器3.1得到空构造器3.2得到两个参数的有参构造器&a…...

使用小皮【phpstudy】运行Vue+MySql项目
现在的情况是我扒到了一个开源的项目,现在想要实现一下前端对应的功能,后端是完备的,但是需要调用数据库将数据跑起来,这里可以使用到MySql数据库,这里我还发现了一个比较好用的软件小皮【phpStudy】 官网 一 安装软件…...
局部静态变量实现单例模式,线程安全(推荐使用)c++11
class Singleton{ public:~Singleton();static Singleton& getInstance(){static Singleton instance;return instance; } private:Singleton(); };原因是C 11标准中新增了一个特性叫Magic Static:如果变量在初始化时,并发线程同时进入到static声明语…...

Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
目录 前言: 一、决策树思想 二、经典决策树算法 三、算法应用案列 基于Python 和 Scikit-learn 库实现决策树算法的简单示例代码,用于解决分类问题: 四、总结 算法 决策树算法应用: 决策树算法优缺点: 博主介绍&…...

Mybatis-Plus——09,代码自动生成器
代码自动生成器 一、先创建一个表二、创建一个类,配置代码生成器三、运行方法四、运行主方法,报错了。 一、先创建一个表 二、创建一个类,配置代码生成器 package com.gang;import com.baomidou.mybatisplus.annotation.DbType; import com.…...

Temu api接口 获取商品详情 数据采集
iDataRiver平台 https://www.idatariver.com/zh-cn/ 提供开箱即用的Temu电商数据采集API,供用户按需调用。 接口使用详情请参考Temu接口文档 接口列表 1. 获取商品详情 参数类型是否必填默认值示例值描述apikeystring是idr_***从控制台里复制apikeycountrystrin…...

安捷伦Agilent N1912A功率计
181/2461/8938产品概述: Keysight(原Agilent) N1912A P系列双通道功率计可提供峰值、峰均比、平均功率、上升时间、下降时间、最大功率值、最小功率值以及宽带信号的统计数据。 Keysight(原Agilent) N1912A P系列双通道功率计, 可提供峰值、峰均比、平均功率、上升…...

ES 进阶知识
索引Index 一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们…...

ChatGPT 对 ELT的理解
本文主要内容来自 ChatGPT 4.0 到底什么是 ETL?在数据库内部,把数据从 ODS 层加工成 DWD,再加工成 DWS,这个过程和 ETL 的关系是什么?带着这些问题,我问了一下 ChatGPT,总结如下。 数据在两个数…...

qt事件机制学习笔记
实现闹钟功能 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speecher(new QTextToSpeech(this)) //给语音播报者实例化空间 {ui->setupUi(this); }Widget::~Widget() {delete …...

网红电商主播培养体系招聘管理制度孵化方案
【干货资料持续更新,以防走丢】 网红电商主播培养体系招聘管理制度孵化方案 部分资料预览 资料部分是网络整理,仅供学习参考。 共120页可编辑(完整资料包含以下内容) 目录 主播团队组建方案 让好主播主动留下 1. 好主播选拔标准…...
Android获取经纬度的最佳实现方式
Android中获取定位信息的方式有很多种,系统自带的LocationManager,以及第三方厂商提供的一些定位sdk,都能帮助我们获取当前经纬度,但第三方厂商一般都需要申请相关的key,且调用量高时,还会产生资费问题。这…...
芒果YOLOv8改进137:主干篇CSPNeXt,小目标检测专用,COCO数据集验证,协调参数量和计算量的均衡,即插即用 | 打造高性能检测
该专栏完整目录链接: 芒果YOLOv8深度改进教程 芒果专栏 本篇基于 CSPNeXt 的改进结构,改进源码教程 | 详情如下🥇 本博客 CSPNeXt 改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 即插即用 结构,博客包括改进所需的 核心结构代码 文件 重点:🔥🔥🔥YOLOv8 …...

【测试开发学习历程】认识Python + 安装Python
目录 1 认识 Python 1.1 Python 的起源 1.2 Python的组成 1.2.1 解释器 1.1.2 Python 的设计目标 1.1.3 Python 的设计哲学 1.2 为什么选择 Python 测试人员选择Python的理由 1.3 Python 特点 面向对象的思维方式 1.4 Python 的优缺点 1.4.1 优点 1.4.2 缺点 3. 安…...
webpack proxy工作原理?为什么能解决跨域?
一、是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实现代理首先需要一个中间服务器,webpac…...

ArkTS编写的HarmonyOS原生聊天UI框架
简介 ChatUI,是一个ArkTS编写的HarmonyOS原生聊天UI框架,提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容,请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…...

uni-app中web-view的使用
1. uni-app中web-view的使用 uni-app中的web-view是一个 web 浏览器组件,可以用来承载网页的容器,uni-app开发的app与web-view实现交互的方式相关简单,应用通过属性message绑定触发事件,然后在web-view的网页向应用 postMessage 触…...
前端跨域概念及解决方法
文章目录 前端跨域概念及解决方法什么是跨域跨域的解决方法JSONP跨域CORS简单请求 非简单请求 Nginx反向代理 前端跨域概念及解决方法 什么是跨域 同源指:两个页面域名、协议、端口均相同。 同源策略是浏览器的一个安全限制,跨域是由浏览器的同源策略造…...
Redis中的事务机制
Redis中的事务机制 概述。 事务表示一组动作,要么全部执行,要么全部不执行。例子如下。 Redis提供了简单的事务功能,讲一组需要一起执行的命令放到multi和exec两个命令之间。multi命令代表事务开始,exec命令代表事务结束&#x…...

从零到一构建短链接系统(八)
1.git上传远程仓库(现在才想起来) git init git add . git commit -m "first commit" git remote add origin OLiyscxm/shortlink git push -u origin "master" 2.开发全局异常拦截器之后就可以简化UserController 拦截器可以…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...