Java基础数据结构之反射

news2024/11/16 9:21:11

一.定义

Java的反射机制是在运行状态中的,对于任意一个类都能知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法及属性。既然能拿到,我们就可以修改部分类型信息。这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射(reflection)机制。

二.反射基本信息

Java 程序中许多对象在运行时会出现两种类型: 运行时类型 (RTTI) 和编译时类型 ,例如 Person p = new Student();这句代码中 p 在编译时类型为 Person ,运行时类型为 Student 。程序需要在运行时发现对象和类的真实信息。而通过使用反射程序就能判断出该对象和类属于哪些类。

三.与反射相关的类

Class类:代表类的实体,在运行的Java应用程序中表示类和接口(就是说,比如在程序中创建了一个Person类,那么就有一个Class对象,里面存放Person类的相关内容)

Field类:代表类的成员变量/类的属性

Method类:代表类的方法

Constructor类:代表类的构造方法

四.Class类

Class类是反射机制的起源Java文件被编译后,生成了.class文件,JVM此时就要去解读.class文件 ,被编译后的Java文件.class也被JVM解析为一个对象,这个对象就是 java.lang.Class .这样当程序在运行时,每个java文件就最终变成了Class类对象的一个实例。我们通过Java的反射机制应用到这个实例,就可以去获得甚至去添加改变这个类的属性和动作,使得这个类成为一个动态的类 .

1.获得Class对象的三种方法

1.使用Class.forName(“类的全路径名”)。注意,这里是类的全路径,如果有包需要加上包的路径

返回值是Class<?>类型,它会抛出受查异常,所以要用try,catch或者用throws。Class后面不加<?>也可以,如下:

2.使用类对象的getClass()方法

3.使用类名.class方法。

这种方法最为安全可靠,程序性能更高。这也说明任何一个类都有一个隐含的静态成员变量class,因为使用对象的实例无法点出class

2.一个类在JVM中只会有一个Class实例

所以有如下代码:

五.反射的具体使用

通过反射,可以调用或修改任何权限的成员变量及方法,包括private权限的

1.通过反射创建对象

用到了newInstance()方法,源码如下:

注意,该方法会抛出受查异常,所以要try catch,代码如下:

但还是报错,为什么?因为该方法的返回值是泛型类,由擦除机制变成Object类,然后要将它给到一个Student引用,就相当于是向下转型,所以要用强制类型转换,如下:

2.调用构造方法

首先是getConstructor方法,可用于调用公有的构造方法,即调用public修饰的方法getDeclaredConstructor是用于调用私有的构造方法,即调用private修饰的方法。

如何调用以下这个私有的构造方法

先看源码:

该方法的参数是构造方法的参数类型,返回值是Constructor<T>,如下使用:

首先要产生一个Constructor对象,然后通过Constructor中的newInstance方法来实例化对象,但运行时报错啦,原因是:Java中为例保证安全性,在调用private修饰的方法前要将许可设置为true,即调用setAccessible方法,设置为true,如下:

但是这样还是在报错,为什么?因为第二个参数是int,所以在getDeclaredConstructor中要传入int.class,而不是Integer.class。如下:

所以从某种程度上来说,反射打破了Java的封装机制,本来private修饰的方法竟然可以在类外被调用

3.反射私有属性

getField是获得某个公有的属性对象,即只能获得由public修饰的属性

getDeclaredField是获得某个属性对象,可以是任何权限的,包括private修饰的,代码如下:

如果要对得到的属性进行修改,就必须加上被注释掉的那句代码:

表示把s1这个对象的年龄修改为13。

注意,这个方法的返回值是Field,而不是Field<?>,所以只可以用Field接收。

4.调用私有方法

getMethod是获得被public修饰的方法
getDeclaredMethod是获得任何权限的方法,包括私有的
如何调用如下私有方法?
代码如下:
getDeclaredMethod的参数是方法名称和方法参数类型
然后要用invoke方法来调用该方法,传入具体对象和参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1418456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是正向代理?为什么要使用它?

在计算机网络中&#xff0c;代理服务器&#xff08;Proxy Server&#xff09;是一种充当客户端和目标服务器之间的中间人的计算机或应用程序。代理服务器可以用于多种目的&#xff0c;其中之一就是正向代理。 正向代理的定义 正向代理是一种代理服务器配置方式&#xff0c;它…

【网络】:网络基础

网络基础 一.总体概述二.认识Mac地址三.数据跨网络传输 一.总体概述 1.协议是什么 1.从概念上说&#xff1a;为了保证不同厂家生产出来的不同型号的电脑能够互相通信&#xff0c;而制定的标准——协议。 2.从技术上说&#xff1a;简单粗暴的理解——是操作系统里的结构体。 2.…

Flink的SQL开发

概叙 Flink有关FlinkSQL的官网: https://nightlies.apache.org/flink/flink-docs-release-1.13/zh/docs/dev/table/sql/overview/ 阿里云有关FlinkSQL的官网: https://help.aliyun.com/zh/flink/developer-reference/overview-5?spma2c4g.11186623.0.0.3f55bbc6H3LVyo Ta…

Windows系统本地安装Everything搜索神器并结合内网穿透实现远程访问

文章目录 前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前言 要搭建一个在线资料库&#xff0c;我们需要两个软件的支持&#xff0c;分别是cpolar&#xff08;用于搭建内网穿透数据隧道…

金融OCR领域实习日志(一)——OCR技术从0到1全面调研

一、OCR基础 任务要求&#xff1a; 工作原理 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;是指电子设备&#xff08;例如扫描仪或数码相&#xff09;检查纸上打印的字符&#xff0c;经过检测暗、亮的模式肯定其形状&#xff0c;而后用…

(自用)learnOpenGL学习总结-高级OpenGL-立方体贴图

ok终于来到了立方体贴图了&#xff0c;在这里面我们可以加入好看的天空包围盒&#xff0c;这样的画我们的背景就不再是黑色的了&#xff01; 首先&#xff0c;立方体贴图和前面的sampler2D贴图一样&#xff0c;不过是6个2D组成的立方体而已。 那么为什么要把6个组合在一起呢&…

粒子群优化算法(Particle Swarm Optimization,PSO)求解基于移动边缘计算的任务卸载与资源调度优化(提供MATLAB代码)

一、优化模型介绍 移动边缘计算的任务卸载与资源调度优化原理是通过利用配备计算资源的移动无人机来为本地资源有限的移动用户提供计算卸载机会&#xff0c;以减轻用户设备的计算负担并提高计算性能。具体原理如下&#xff1a; 任务卸载&#xff1a;移动边缘计算系统将用户的计…

嵌入式学习第十三天

9.指针: &#xff08;1&#xff09;const指针 const 关键字 常量(只读) 1.const int *p; 2.int const *p; 1和2是等价的 const修饰 *p,指针变量p的值可以改变,但不能利用指针修改指向空间中的值 3.int *const p; const修饰 p,指针变量p的值不能改变…

幻兽帕鲁越玩越卡,内存溢出问题如何解决?

近期幻兽帕鲁游戏大火&#xff0c;在联机组队快乐游玩的同时&#xff0c;玩家们也发现了一些小问题。由于游戏有随机掉落材料的设定&#xff0c;服务器在加载掉落物的过程中很容易会出现掉帧、卡顿的情况。某些玩家甚至在游戏1&#xff5e;2时后就出现服务器崩溃的情况&#xf…

招聘网站简单爬虫_24.1.26

完整程序传送门 24.1.26 前些天接了一个大两届的师兄的小活&#xff0c;做了一下爬boss直聘岗位信息的程序&#xff0c;在这里记录一下 程序框架 定义一个名为paQu的接口函数&#xff0c;用于检查窗口的输入&#xff0c;它接受一个参数self&#xff0c;获取self对象的a属性&am…

服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE复现

知识点&#xff1a; 1、PHP-框架安全-Thinkphp&Laravel 2、J2EE-框架安全-SpringBoot&Struts2 章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数据库&中间件&开发框架&am…

Python爬虫请求库安装

请求库的安装 爬虫可以简单分为几步&#xff1a;抓取页面、分析页面和存储数据。 在抓取页面的过程中&#xff0c;我们需要模拟浏览器向服务器发出请求&#xff0c;所以需要用到一些 Python 库来实现 HTTP 请求操作。在本教程中&#xff0c;我们用到的第三方库有 requests、S…

基于vue实现待办清单案例

一、需求 新增内容&#xff1b; 删除内容&#xff1b; 统计操作&#xff1b; 清空数据。 示例图&#xff1a; 二、代码演示 1、基础准备 index.css代码 html, body {margin: 0;padding: 0; } body {background: #fff ; } button {margin: 0;padding: 0;border: 0;backgr…

BF16与FP16的区别

参考 BF16 与 FP16 在模型上哪个精度更高呢BF16 与 FP16 在模型上哪个精度更高呢【bf16更适合深度学习计算&#xff0c;精度更高】&#xff1a; 两者差异图示如下&#xff1a; BF16 是对FP32单精度浮点数截断数据&#xff0c;即用8bit 表示指数&#xff0c;7bit 表示小数。…

微博怎么把客户引流到私域?(引流技巧)

微博 1&#xff09;背景banner图 在微博主页顶部的背景图里&#xff0c;可以引导添加个人微信、公众号等信息&#xff0c;通常配合福利引导用户添加。 2&#xff09;个人简介 微博中比较常见的引流方式&#xff0c;可以直接在简介区内留下微信号、公众号名称、邮箱等信息&#…

差异性分析汇总

在做科研写论文的时候&#xff0c;我们总会听说要对数据进行差异性分析&#xff0c;那么何为差异性分析&#xff1f;差异性分析常用的方法有哪些&#xff1f;这些方法应该如何进行分类&#xff1f;如何选择&#xff1f;差异性分析的数据格式是怎么样的&#xff1f;软件如何操作…

MarkDown快速入门-以Obsidian编辑器为例

直接上图&#xff0c;左右对应。 首先是基础语法。 # 标题&#xff0c;几个就代表几级标题&#xff1b;* 单个是序号&#xff0c;两个在一起就是斜体&#xff1b;- [ ] 代表任务&#xff0c;注意其中的空格&#xff1b; 然后是表格按钮代码 | 使用中竖线代表表格&#xff0c…

Bean的注入方法和区别

Bean有几种注入方式&#xff1f;它们有什么区别&#xff1f; Bean对象中有以下几种注入方式&#xff1a; 属性注入Setter注入构造方法注入 属性注入 属性注入是我们最熟悉的&#xff0c;也是日常开发最常使用的一种注入方式&#xff0c;它的实现代码如下&#xff1a; Rest…

HTML小白入门学习-表单标签

一、前言 HTML标签千千万&#xff0c;要学习的占一半。上篇文章中我们学习了列表标签&#xff0c;针对有序列表、无序列表、自定义列表和嵌套列表进行简单的学习了解和实操。本篇文章将为大家介绍另一种常用标签&#xff0c;那就是表单类标签。 我们在网页中经常会看到表单的…

JavaScript版数据结构与算法(二)图、堆、搜索排序算法、算法设计思想

一、图 &#xff08;一&#xff09;图是什么 图是网络结构的抽象模型&#xff0c;是一组由边连接的节点。图可以表示任何二元关系&#xff0c;比如道路、航班… JS中没有图&#xff0c;但是可以用 Object 和 Array 构建图。图的表示法&#xff1a;邻接矩阵、邻接表… 1、邻接…