干货分享之反射笔记
入门级笔记-反射
- 一、利用反射破泛型集合
- 二、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 拦截器可以…...

缺省和重载。引用——初识c++
. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 C输入&输出cout 和cin<<>> 缺省参数全缺省半缺省应用场景声明和定义分离的情况 函数重载1.参数的类型不同2.参数的个数不同3.参数的顺…...

java常用IO流功能——字符流和缓冲流概述
前言: 整理下学习笔记,打好基础,daydayup! 之前说了下了IO流的概念,并整理了字节流,有需要的可以看这篇 java常用应用程序编程接口(API)——IO流概述及字节流的使用 字符流 FileReader(文件字…...

Python中模块的定义、用法
在Python中,模块是一个包含了Python代码的文件。模块可以包含变量定义、函数、类等,并且可以在其他Python脚本中被导入和使用。模块的定义和用法如下所示: 模块的定义: 创建模块文件:在Python中,一个模块就…...

【vscode 常用扩展插件】
vscode 常用扩展插件 常用插件部分插件使用技巧1、eslint 保存自动格式化2、代码片段的使用3、最后是关于引入文件路径提示的 常用插件 记录vscode方便开发的扩展插件,方便换电脑时,快速部署所需环境。 部分插件 1、Auto Close Tag html自动闭合标签插…...

Retelling|Facebook2
录音 Facebook 2 Retelling|Facebook2 复述转写 Hi, Im Helen Campbell, from DJ interpretation, European Commission, Im going to talk about Facebook. You Im sure that you are more familiar with Facebook, a lot, a lot more familiar than I than me. But Ive read…...

读3dsr代码①测试
前置任务 首先是作者不公开checkpoints,需要自己训练一遍 这里先不载入模型单纯过一遍流程 而且因为没有说明是否需要去背景(之后再过一下论文),所以反正先用去过背景的数据debug一下 3DSR/geo_utils.py:61: RuntimeWarning: inv…...

Vant Weapp小程序 van-uploader 文件上传点击无反应,删除无反应
Vant Weapp 1.0 版本开始支持van-uploader组件,请先确认好版本号和引用路径正确!! <van-uploader file-list"{{ fileList }}" deletable"{{ true }}" />1. 上传无反应 微信小程序用了van-uploader,但是…...

【力扣】55.跳跃游戏、45.跳跃游戏Ⅱ
55.跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1&a…...

038—pandas 重采样线性插补
前言 在数据处理时,由于采集数据量有限,或者采集数据粒度过小,经常需要对数据重采样。在本例中,我们将实现一个类型超分辨率的操作。 思路: 首先将原始数据长度扩展为 3 倍,可以使用 loc[] 方法对索引扩…...

智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示(PC端、手机端、平板端)
智慧工地源码 数字孪生可视化大屏 工地管理平台系统源码 多端展示(PC端、手机端、平板端) 智慧工地系统多端展示(PC端、手机端、平板端);数字孪生可视化大屏,一张图掌握项目整体情况;使用轻量化模型,部署三…...