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

数据结构:反射 和 枚举

目录

一、反射

1、定义

2、反射相关的类

3、Class类 

(2)常用获得类中属性相关的方法:

(3)获得类中注解相关的方法:

(4)获得类中构造器相关的方法:

(5)获得类中方法相关的方法:

4、Class反射实例

(1)获得Class对象的三种方式

(2)反射的使用

5、反射的优缺点

 二、枚举

1、定义

2、使用

(1)switch语句

(2)枚举常用方法

3、枚举的优缺点


一、反射

1、定义

Java的反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性而这也是Java的被视为动态语言的一个关键性质。

2、反射相关的类

类名用途
Class类代表类的实体,在运行的Java应用程序中表示类和接口
Field类代表类的成员变量/类的属性
Method类代表类的方法
Constructor类代表类的构造方法

3、Class类 

Class帮助文档

代表类的实体,在运行的Java应用程序中表示类和接口。


 Class类中相关的方法

(1)常用获得类相关的方法:

方法用途
getClassLoader()获得类的加载器
getDeclaredClasses()返回一个数组,数组中包含该类中所有类和接口类的对象(包括私有的)
forName(String className)根据类名返回类的对象
newinstance()创建类的实例
getName()获得类的完整路径名字

(2)常用获得类中属性相关的方法:

方法用途
getField(String name)获得某个公有的属性对象
getFields()获得所有公有的属性对象
getDeclaredField(String name)获得某个属性对象
getDeclaredFields()获得所有属性对象

以上方法返回值为Field相关


(3)获得类中注解相关的方法:

方法用途
getAnnotation(Class<A> annotationClass)返回该类中与参数类型匹配的公有注解对象
getAnnotations()返回该类所有的公有注解对象
getDeclaredAnnotation(Class<A>annotationClass)返回该类中与参数类型匹配的所有注解对象
getDeclaredAnnotations()返回该类所有的注解对象

(4)获得类中构造器相关的方法:

方法用途
getConstructor(Class...<?>parameterTypes)获得该类中与参数类型匹配的公有构造方法
getConstructors()获得该类的所有公有构造方法
getDeclaredConstructor(Class...<?>parameterTypes)获得该类中与参数类型匹配的构造方法
getDeclaredConstructors()获得该类所有构造方法

以上方法返回值为Constructor相关


(5)获得类中方法相关的方法:

方法用途
getMethod(String name, Class...<?>parameterTypes)获得该类某个公有的方法
getMethods()获得该类所有公有的方法
getDeclaredMethod(String name,Class...<?> parameterTypes)获得该类某个方法
getDeclaredMethods()获得该类所有方法

以上方法返回值为Method相关

4、Class反射实例

(1)获得Class对象的三种方式

第一种,使用 Class.forName("类的全路径名");静态方法。 

前提:已明确类的全路径名。


第二种,使用  .class 方法。

说明:仅适合在编译前就已经明确要操作的Class。


第三种,使用类对象的 getClass() 方法。

(2)反射的使用

调用不带参数的构造方法:

首先我们肯定是要创建一个对象,然后我们在将我们的对像进行实例化,而在上面我们已经看到了一种方法:newinstance(),用来创建类的实例,但是我们使用完后发现他是存在异常的,因此我们还要处理异常

而我们的newinstance()是默认调用不带参数的构造方法的。


调用带参数的构造方法:

1、在这里我们使用了一个新的方法:getDeclaredConstructor(),获得该类中与参数类型匹配的构造方法。(我们要根据要调用的类型在()中写入参数),并且他的返回类型是Constructor,所以我们要用Constructor接收。同时,我们发现在使用getDeclaredConstructor()方法时,是会出现异常的因此我们要处理异常

2、这时我们得到了一个Constructor类型的对象,而Constructor同样具有newinstance()方法,因此我们还是调用newinstance()方法,并根据Student类型的参数类型进行传参,同时处理异常。

3、最后由于我们要调用的构造方法是私有的,因此我们要使用Constructor类中的setAccessible(true)方法告诉编译器,我们是可以使用私有的方法的。


调用私有的属性:

1、对于属性,我们根据上面的了解是要使用返回类型为 Field 的这些方法来,调用我们的私有属性:getDeclaredField(String name),获得某个属性对象,同时我们还要处理异常

2、因为是要调用私有方法,所以我们需要使用:setAccessible(true)方法告诉编译器,我们是可以使用私有的方法的。

3、然后根据我们的class对象使用:newinstance()方法,来实例化我们的Student对象。同时处理我们的异常

4、之后使用返回的 Field 类型的 field 对象调用set方法来修改我们Student类型的私有属性

5、最后利用Field 类型的 field 对象调用给get方法来得到我们Student类型的私有属性


 调用私有方法:

1、对于方法,我们根据上面的了解是要使用返回类型为 Method 的这些方法来,调用我们的私有属性:getDeclaredMethod(String name,Class...<?> parameterTypes),获得该类某个方法,第一个参数为要调用方法的名称,第二个为要调用方法的参数类型同时我们还要处理异常。

2、因为是要调用私有方法,所以我们需要使用:setAccessible(true)方法告诉编译器,我们是可以使用私有的方法的。

3、然后根据我们的class对象使用:newinstance()方法,来实例化我们的Student对象。同时处理我们的异常。

4、之后使用返回的 Method 类型的 method 对象调用 invoke 方法来修改我们Student类型的私有方法的私有属性

5、反射的优缺点

优点:

1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法

2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力。


缺点:

1. 使用反射会有效率问题。会导致程序效率降低。

2. 反射技术绕过了源代码的技术,因而会带来维护问题。反射代码比相应的直接代码更复杂。

 二、枚举

1、定义

在JDK1.5之前,如果我们想要将一组常量组织起来,并且表示这一组常量,我们通常使用定义常量的方式

 public static  final int RED = 1;public static  final int GREEN = 2;public static  final int BLACK = 3;

 但是常量举例有不好的地方,例如:可能碰巧有个数字1,但是他有可能误会为是RED,而JDK1.5之后,我们可以直接用枚举来进行组织,这样一来,就拥有了类型,枚举类型。而不是普通的整形1。


优点:将常量组织起来统一进行管理

使用场景:错误状态码,消息类型,颜色的划分,状态机等等..

本质:是 java.lang.Enum 的子类,也就是说,自己写的枚举类,就算没有显示的继承 Enum ,但是其默认继承了这个类。


2、使用

(1)switch语句

public enum TestEnum {RED,GREEN,BLACK;public static void main(String[] args) {TestEnum testEnum2 = TestEnum.BLACK;switch (testEnum2) {case RED:System.out.println("red");break;case GREEN:System.out.println("green");break;case BLACK:System.out.println("black");break;default:break;}}
}

(2)枚举常用方法

Enum 类的常用方法

方法用途
values()以数组形式返回枚举类型的所有成员
ordinal获取枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序
public enum TestEnum {RED,GREEN,BLACK;public static void main(String[] args) {//values方法TestEnum[] testEnum =  TestEnum.values();//ordinal方法for (int i = 0; i < testEnum.length; i++) {System.out.println(testEnum[i] + " " + testEnum[i].ordinal());}//valueOf方法System.out.println(TestEnum.valueOf("GREEN"));//compareTo方法System.out.println(BLACK.compareTo(RED));System.out.println(RED.compareTo(RED));System.out.println(GREEN.compareTo(BLACK));}
}


 刚刚说过,在Java当中枚举实际上就是一个类。既然是类那么就有构造方法

public enum TestEnum {RED("red",1),GREEN("green",2),BLACK("black",3);private  String name;private  int key;private TestEnum (String name,int key) {this.name = name;this.key = key;}
}

注意:枚举的构造方法默认是私有的

3、枚举的优缺点

优点:

1. 枚举常量更简单安全。

2. 枚举具有内置方法,代码更优雅


缺点:

1. 不可继承,无法扩展


好了,今天的分享就到这里了,还请大家多多关注,我们下一篇见!

相关文章:

数据结构:反射 和 枚举

目录 一、反射 1、定义 2、反射相关的类 3、Class类 &#xff08;2&#xff09;常用获得类中属性相关的方法&#xff1a; &#xff08;3&#xff09;获得类中注解相关的方法&#xff1a; &#xff08;4&#xff09;获得类中构造器相关的方法&#xff1a; &#xff08;…...

前缀和算法 算法4

算法题中帮助复习的知识 vector<int > dp( n ,k); n为数组大小 ,k为初始化 哈希表unordered_map<int ,int > hash; hash.find(k)返回值是迭代器 ,找到k返回其迭代器 没找到返回hash.end() hash.count(k)返回值是数字 ,找到k返回1 ,没找到返回0. C和java中 负数…...

USRP7440-通用软件无线电平台

1、产品描述 USRP7440基于第三代XILINX Zynq UltraScale RFSoC架构&#xff0c;它将射频ADC、DAC、ARM、FPGA等集成一体&#xff0c;瞬时带宽可以达到2.5GHz&#xff0c;尤其适合于射频直采应用&#xff0c;比如通信与雷达。 第一代RFSOC高达4GHz • 8x 或 16x 6.554GSPS DAC…...

yunedit-post ,api测试比postman更好

postman应该是大家最熟悉的api测试软件了&#xff0c;但是由于它是外国软件&#xff0c;使用它的高端功能注册和缴费都比较麻烦。生成在线文档分享也经常无法访问被拦截掉。 这里可以推荐一下yunedit-post&#xff0c;该有的功能都有。 https://www.yunedit.com/postdetail …...

windows下玩转vllm:在wsl下安装vllm后续,设置modelscope作为下载源

文章目录 前言所涉及的之前的关键步骤解决模型权重下载网络不通畅的问题vllm和modelscope整合后的bug附录 ImportError: cannot import name _try_login from modelscope.utils.hf_util 全部报错信息前言 之前,咱们说了,由于windows不支持直接部署vllm,所以要么采用wsl,要…...

移动零

一 &#xff1a;题目 二&#xff1a;思路 双指针法&#xff1a; 两个指针将数组划分成三个部分&#xff1a; 解释&#xff1a; ①&#xff1a;所以一开始dest要等于-1&#xff0c;因为没有非零的元素&#xff0c;cur0&#xff0c;因为要从头开始遍历数组 ②&#xff1a;cur为…...

MySQL整体架构

目录 1 客户端 2 服务端 2.1 Server层 2.1.1 连接器 2.1.2 查询缓存 2.1.3 词法器 2.1.4 优化器 2.1.5 执行器 2.2 存储引擎层 1 客户端 ● 客户端为连接MySQL服务端的工具或者驱动&#xff0c;比如JDCB&#xff0c;ODBC等等 ● 用于连接目前服务器&#xff0c;并且发送需要执行…...

Linux之yum详解

—— 小 峰 编 程 目录 1、Linux软件的安装方式 2、什么是yum 3、配置网络yum源 4、yum命令 【语法】 【yum常用命令】 1、Linux软件的安装方式 在CentOS系统中&#xff0c;软件管理方式通常有三种方式&#xff1a; rpm安装 、 yum安装 以及 编译安装 。 2、什么是yum…...

大数据学习(52)-MySQL数据库基本操作

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…...

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件&#xff0c;找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...

记忆化搜索(典型算法思想)—— OJ例题算法解析思路

目录 一、509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 1. 动态规划 (fib 函数) 初始化&#xff1a; 递推计算&#xff1a; 返回结果&#xff1a; 2. 记忆化搜索 (dfs 函数) 备忘录初始化&#xff1a; 递归终止条件&#xff1a; 递…...

Day11,Hot100(贪心算法)

贪心 &#xff08;1&#xff09;121. 买卖股票的最佳时机 第 i 天卖出的最大利润&#xff0c;即在前面最低价的时候买入 class Solution:def maxProfit(self, prices: List[int]) -> int:min_price prices[0]ans 0for price in prices:ans max(ans, price - min_price…...

翻译: 深入分析LLMs like ChatGPT 一

大家好&#xff0c;我想做这个视频已经有一段时间了。这是一个全面但面向普通观众的介绍&#xff0c;介绍像ChatGPT这样的大型语言模型。我希望通过这个视频让大家对这种工具的工作原理有一些概念性的理解。 首先&#xff0c;我们来谈谈你在这个文本框里输入内容并点击回车后背…...

《白帽子讲 Web 安全》之移动 Web 安全

目录 摘要 一、WebView 简介 二、WebView 对外暴露 WebView 对外暴露的接口风险 三、通用型 XSS - Universal XSS 介绍 四、WebView 跨域访问 五、与本地代码交互 js 5.1接口暴露风险&#xff1a; 5.2漏洞利用&#xff1a; 5.3JavaScript 与 Native 代码通信 六、Chr…...

解锁 indexOf、substring 和 JSON.stringify:从小程序图片上传看字符串魔法 ✨

&#x1f31f; 解锁 indexOf、substring 和 JSON.stringify&#xff1a;从小程序图片上传看字符串魔法 ✨ 在 JavaScript 中&#xff0c;字符串操作和数据序列化是开发中不可或缺的技能。indexOf、substring 和 JSON.stringify 是三个简单却强大的工具&#xff0c;分别用于定位…...

常用的AI文本大语言模型汇总

AI文本【大语言模型】 1、文心一言https://yiyan.baidu.com/ 2、海螺问问https://hailuoai.com/ 3、通义千问https://tongyi.aliyun.com/qianwen/ 4、KimiChat https://kimi.moonshot.cn/ 5、ChatGPThttps://chatgpt.com/ 6、魔塔GPT https://www.modelscope.cn/studios/iic…...

DCN讲解

DCN是DeepFM的升级版&#xff0c;后者是只能做二阶交叉特征&#xff0c;随着阶数上升&#xff0c;模型复杂度大幅提高&#xff0c;且FM网络层较浅&#xff0c;表达能力有限。google团队通过构建深度交叉网络来自动进行特征的高阶交叉&#xff0c;且时空复杂度均为线性增长&…...

前端开发常用的加密算法

以下是前端开发中常用的加密方式及其适用场景的详细说明&#xff1a; 一、核心加密方案 加密类型常用算法特点适用场景对称加密AES、DES、3DES加密解密使用相同密钥&#xff0c;速度快本地存储加密、HTTP Body加密非对称加密RSA、ECC公钥加密私钥解密&#xff0c;安全性高传输…...

5. Nginx 负载均衡配置案例(附有详细截图说明++)

5. Nginx 负载均衡配置案例(附有详细截图说明) 文章目录 5. Nginx 负载均衡配置案例(附有详细截图说明)1. Nginx 负载均衡 配置实例3. 注意事项和避免的坑4. 文档: Nginx 的 upstream 配置技巧5. 最后&#xff1a; 1. Nginx 负载均衡 配置实例 需求说明/图解 windows 浏览器输…...

C++之再识模板template

目录 1.非类型模板参数 2.函数/类模板的特化 3.模板的分离编译 4.总结&#xff1a;模板的优缺点 1. 代码复用性高 2. 类型安全 3. 性能优化 2. 错误信息难以理解 3. 代码膨胀 易错易忽略的语法点&#xff1a; 1. 模板声明和定义分离问题 2. 模板参数推导问题 1.非类…...

【文献阅读】Collective Decision for Open Set Recognition

基本信息 文献名称&#xff1a;Collective Decision for Open Set Recognition 出版期刊&#xff1a;IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING 发表日期&#xff1a;04 March 2020 作者&#xff1a;Chuanxing Geng and Songcan Chen 摘要 在开集识别&#xff0…...

力扣刷题DAY2(链表/简单)

一、回文链表 回文链表 方法一&#xff1a;双指针 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, L…...

golang 内存对齐和填充规则

内存对齐和填充规则 对齐要求&#xff1a;每个数据类型的起始地址必须是其大小的倍数。 int8&#xff08;1字节&#xff09;&#xff1a;不需要对齐。int16&#xff08;2字节&#xff09;&#xff1a;起始地址必须是2的倍数。int32&#xff08;4字节&#xff09;&#xff1a;起…...

ansible自动化运维工具学习笔记

目录 ansible环境部署 控制端准备 被控制端准备 ansible批量管理主机的方式主要有两种 配置准备&#xff1a; ssh密码认证方式管理机器 密码登录&#xff0c;需要各主机密码相同 配置免密登录 ssh密钥方式批量管理主机 ansible实现批量化主机管理的模式 ansible-doc命令 comman…...

零基础deep seek+剪映,如何制作高品质的视频短片

以下是专为零基础学习者设计的 剪映专业版详细教程&#xff0b;Deep seek配合制 &#xff0c;包含从入门到精通的系统化教学&#xff0c;配合具体操作步骤与实用技巧&#xff1a; 基于DeepSeek与剪映协同制作高品质视频短片的专业流程指南&#xff08;2025年最新实践版&#x…...

网络空间安全(4)web应用程序安全要点

前言 Web应用程序安全是确保Web应用程序、服务和服务器免受网络攻击和威胁的关键环节。 一、编写安全的代码 输入验证与过滤&#xff1a;确保所有的用户输入都被正确验证和过滤&#xff0c;以防止注入攻击等安全漏洞。开发者应对URL、查询关键字、HTTP头、POST数据等进行严格的…...

【word】保存重开题注/交叉引用消失,全局更新域问题

目录 一、更新域是什么二、更新域常见问题及解决方法&#xff08;一&#xff09;更新域后内容未变化&#xff08;二&#xff09;域代码显示异常&#xff08;三&#xff09;交叉引用无法更新&#xff08;四&#xff09;全选更新域出现错误 三、交叉引用与题注的关系及操作&#…...

大语言模型中的 Token:它们是什么,如何工作?

引言 如果你使用过 ChatGPT 这样的 AI 工具&#xff0c;你可能会好奇&#xff1a;它是如何理解并生成文字的&#xff1f;大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;并不是直接处理整个句子或文章&#xff0c;而是拆分成一个个 Token&#xff08;…...

DeepSeek的无限可能

DeepSeek的无限可能 DeepSeek简介DeepSeek定义DeepSeek的发展历程DeepSeek的核心功能 如何使用DeepSeek注册与安装模型使用原则提示语的使用 人机共生 DeepSeek简介 DeepSeek定义 DeepSeek&#xff08;中文名&#xff1a;深度求索&#xff09;是一款由杭州深度求索人工智能基…...

【wordpress】服务器已有LNMP环境(已运行WordPress),如何配置文档访问功能?

效果如图步骤确定文件存放目录404.html修改配置文件重启nginx服务 接下来是从win向linux云服务器上传文件使用Samba服务&#xff08;没成功&#xff09;使用xshell上传文件&#xff08;大文件上传一堆乱码&#xff09;winscp&#xff08;好用&#xff09; 效果如图 如果url不对…...