数据结构:反射 和 枚举

news2025/4/8 2:44:27

目录

一、反射

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. 不可继承,无法扩展


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

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

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

相关文章

前缀和算法 算法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 …

移动零

一 &#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…

鸿蒙启动页开发

鸿蒙启动页开发 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;且时空复杂度均为线性增长&…

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…

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

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

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

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