Java-数据结构-反射、枚举 |ू・ω・` )

news2024/10/11 6:23:13

目录

❄️一、反射:

       1、定义:

       2、用途:

       3、反射相关的类:

       4、Class类:

                1、Class类中相关的方法:

       5、Class反射实例:

                1、获得Class对象的三种方式:

                2、反射的使用:

       6、反射的优点和缺点:

 ❄️二、枚举:

       1、定义:

       2、使用:

       3、枚举的优点和缺点:

 ❄️总结:


❄️一、反射:

       1、定义:

       Java的反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到那么,我们就可以修改部分类型信息。

         这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


       2、用途:

1:当存在私有的成员变量、方法或者只对系统开放的,这个时候可以利用反射来获取所需的成员变量、方法。

2:可以开发各种类型的框架。


       3、反射相关的类:

类名用途
Class类

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

Field类

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

Method类

代表类的方法

Constructor类

代表类的构造方法

   在Java中大多数对象在运行的时候都会有:运行时类型 和 编译时类型 这两种类型,比如:

Person p1 = new Student();这个呢在编译时类型为Person,运行时类型为Student


       4、Class类:

 Class的帮助手册

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

                1、Class类中相关的方法:

常用获得类相关的方法:

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

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

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

注意:这些方法的返回值是  Field相关


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

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

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

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

注意:这些方法的返回值为 Constructor相关 


获得类中方法相关的方法:

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

注意:以上方法的返回值为 Method相关 


       5、Class反射实例:

                1、获得Class对象的三种方式:

第一种:。

      使用 Class.forName(“类的全路径名”),静态方法,这个的使用前提:已明确类的全路径名

第二种:

     使用 .class 方法,仅适合在编译前就已经明确要操作的 Class

第三种:

     使用类对象的 getClass() 方法


我们来演示一下:

这个就是这三种获得 Class 对象的方法的演示了。我们再来看看 反射的使用。

注意:这里的第一种方法,会抛出一种异常,我们要对其进行处理这个异常。


                2、反射的使用:

     我们常用的方法呢就是第一种方法来使用反射。

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

我们在上面的方法中已经介绍了一种方法 —— newInstance(),是用来创建类的实例的。

这个呢同样也存在异常的,所以我们同样要处理异常。

      我们调用的是——不带参数的构造方法,而且我们在使用 Student 没有去 new 这个对象,就可以调用这个类。


     我们在上面已经知道了关于 不带参数的构造方法 如何通过反射来调用的。那么对于 带参数的构造方法 是如何通过反射类调用的?我们来看看:

调用带参数的构造方法并且是私有的:

1、我们这里使用的呢是 —— getDeclaredConstructor,这个方法。

2、我们的 Student 的成员变量呢有 String 和 int 类型,所以我们需要传参,传两个形参。

3、我们使用 Constructor 来接收,这里要注意的是:在上面的 Student 中 不带参数的构造方法呢是私有的所以我们要使用一个方法 —— setAccessible(true) 来告诉编译器,我们可以使用私有的属性

4、同样会抛出异常,所以我们需要解决这个异常

实现:

 我们可以看到,这次呢调用的就是 有参数的构造方法了。


我们在来看看关于 私有的属性,我们要如何才能使用反射来调用 私有的属性 呢?我们来看:

调用 私有的属性: 

  1、对于 属性 我们使用返回 Field 的这些方法来调用,这里调用 私有属性 我们是使用 —— getDeclaredField(String name) 方法。

2、因为是 私有的属性,所以我们需要使用 —— setAccessible(true) 来处理

3、先把我们拿到的 class 对象使用 —— newInstance() 方法来创建 Student 对象

4、使我们返回的 Field 来调用 set 方法来修改 私有的属性。

5、不要忘记处理它们的异常。

实现:

 这里的 name 这个私有属性进行了改变。


我们来看看如何才能调用 私有方法 :

1、对于 方法 我们使用返回 Method 的这些方法来调用,这里调用 私有方法 我们是使用 —— getDeclaredMethod(String name,Class...<?> parameterTypes) 方法。这里第一个参数为方法名称。第二个参数为参数列表

2、因为是 私有的方法,所以我们需要使用 —— setAccessible(true) 来处理

3、先把我们拿到的 class 对象使用 —— newInstance() 方法来创建 Student 对象

4、使我们返回的 Method 来调用 invoke 方法来修改 私有的属性。

5、不要忘记处理它们的异常。

实现:

 这样就可以调用 私有方法 了。 


       6、反射的优点和缺点:

优点:

1、对于任意一个类,都能够知道这个类的所有属性和方法

      对于任意一个对象,都能够调用它的任意一个方法

2、增加程序的灵活性和扩展性,提高了自适应能力

缺点:

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

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


 ❄️二、枚举:

       1、定义:

  我们要是想要将一组常数组织起来的话呢,我们可能常用的方法呢就是这样的:

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

    但是呢,这种方法呢有不好的地方,比如:我们正好有个数字 1 ,那么它有可能误会为是 RED,这个时候呢,我们就可以使用 枚举 来实现,这样就有了类型——枚举类型。

public enum TestEnum {
    RED,
    BLACK,
    GREEN;
}

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

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

本质:是 java.lang.Enum 的子类,尽管是自己写的 枚举类,即是没有继承 enum 类,但是呢默             认继承了这个 enum 类


       2、使用:

1)、switch 语句:

我们直接来看看代码如何实现的:

public enum TestEnum {
    RED,
    BLACK,
    GREEN;

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

2)、常用方法 :

Enum 的常用方法:

方法名称描述
values()以数组形式返回枚举类型的所有成员
ordinal()获得枚举成员的索引位置
valueOf()将普通字符串转换为枚举实例
compareTo()比较两个枚举成员在定义时的顺序

示例:

public enum TestEnum {
    RED,
    BLACK,
    GREEN;

    public static void main(String[] args) {
        //以数组形式返回枚举类型的所有成员
        TestEnum[] testEnum = TestEnum.values();
        for (int i = 0; i < testEnum.length; i++) {
            //获得枚举成员的索引位置
            System.out.println(testEnum[i] + " " + testEnum[i].ordinal());
        }

        //将普通字符串转换为枚举实例
        TestEnum testEnum1 = TestEnum.valueOf("RED");
        System.out.println(testEnum1);

        //比较两个枚举成员在定义时的顺序
        System.out.println(BLACK.compareTo(RED));
    }
}

我们说过,枚举类型 是一个类,就需要有构造方法,那么我们来看看 枚举类型 的构造方法:

public enum TestEnum {
    RED("red",1),
    BLACK("black",2),
    GREEN("green",3);

    public String color;
    public int ordinal;
    
    private TestEnum(String color,int ordinal) {
        this.color = color;
        this.ordinal = ordinal;
    }
}

这里要注意:枚举的构造方法默认为私有的。


       3、枚举的优点和缺点:

优点:

1、枚举常量更简单安全

2、枚举具有内置方法 

缺点:

1、不可继承,无法拓展


 ❄️总结:

        OK,这次的博客的分享就到这里结束了,我们下一篇还是介绍这个章节,让我们尽情期待吧!!!拜拜~~~

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

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

相关文章

网络基础擅长组建乐队

让我们荡起双桨 来说说网络吧 现有计算机要进行协作&#xff0c;网络的产生是必然的 局域网&#xff1a;计算机数量更多了, 通过交换机和路由器连接在一起 广域网&#xff1a;将远隔千里的计算机都连在一起 交换机路由器等设备就应运而生 计算机是人的工具&#xff0c;人要协…

layernorm笔记

文章目录 layer norm的解释二维三维 batchnorm和layernorm主要的区别为什么要在序列转录模型中使用layer norm&#xff1f; layer norm的解释 二维 红色为batchnorm&#xff0c;蓝色为layer norm batchnorm对每一个特征算均值和方差 layer norm对每一个批次算均值和方差 三…

窗口系统与图形绘制接口

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 当我们想要进行底层图形应用(GUI)开发时,往往需要用到窗口系统和图形库,这里简单介绍一下 视窗系统(window system)与通信协议 下面内容主要针对Unix-like操作系统 视窗系统是以使用视窗作为主要特征之一的图形用…

【含开题报告+文档+PPT+源码】基于SSM + Vue的养老院管理系统【包运行成功】

开题报告 随着社会的发展和经济的进步&#xff0c;人口老龄化问题逐渐凸显。统计数据显示&#xff0c;全球范围内的老龄人口比例正在逐年上升&#xff0c;养老需求也随之增长。养老院作为提供专业养老服务的机构&#xff0c;承担着照料老人、提供医疗保健和社交活动等责任。传…

DVWA Brute Force篇暴力破解 Low/Medium/Hight

这里就不再赘述环境搭建&#xff0c;就默认你已经做好环境搭建的准备了.接下来就步入正题(我的bp是汉化) 任务一&#xff0c;设置级别为low级别&#xff0c;创建好我们的字典文件 任务二 开启抓包&#xff0c;并且我们输入错误的账户密码 &#xff08;当我知道账户名称为admin时…

Nginx06-静态资源部署

零、文章目录 Nginx06-静态资源部署 1、静态资源概述 静态资源&#xff1a;是在Web开发中不经常改变的文件&#xff0c;比如图片、CSS样式表、JavaScript脚本文件等。这些资源通常是预先编译好的&#xff0c;不需要服务器端的动态处理。动态资源&#xff1a;是在Web开发中需…

fiddler抓包19_模拟IP地址(如异地IP)

课程大纲 使用场景举例&#xff1a;北京模拟海南IP地址“182.118.99.12”发送请求。 ① 打开CustomRules.js文件&#xff1a;Fiddler快捷键“CtrlR”(或鼠标点击&#xff0c;菜单栏 - Rules“规则” - Customize Rules“自定义规则”)。 ② 添加代码&#xff0c;保存&#xff1…

SpringBoot在线教育系统:架构设计与技术选型

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

计算机网络——DNS

提供域名——>ip地址的转换 分层命名 分布式解析 怎么样维护 DNS实现在边缘系统——传输层及其以上 还提供别名——>规范名字的转换——>ip 负载均衡是一种用于在多个计算资源&#xff08;如服务器、网络设备等&#xff09;之间分配工作负载的技术。其主要目的是…

最小生成树prim算法kruskal算法

最小生成树 在一个无向图中求一棵树(n-1条边&#xff0c;无环&#xff0c;连通所有点)而且这棵树的边的权和最小 prim(普利姆)算法 prim算法有叫加点法&#xff0c;我们先标定一个点&#xff0c;然后寻找与这个点相连的边的权值最小的点&#xff0c;不断重复此操作&#xff…

【鸿蒙学习】深入解析鸿蒙应用与元服务:含义、区别、应用场景及创建方法

文章目录 鸿蒙应用&#xff08;HarmonyOS App&#xff09;含义用于干什么优缺点 元服务&#xff08;Atomic Service&#xff09;含义用于干什么优缺点 鸿蒙应用与元服务的区别创建方法鸿蒙应用的创建元服务的创建 总结 随着科技的不断进步&#xff0c;操作系统也在不断迭代更新…

医院管理自动化:Spring Boot技术实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

上传文件失败,请检查阿里云配置信息:[The specified bucket is not valid.

-- 十一假期结束 -- 去年今日此门中&#xff0c;人面挑花相应红。 -- 人面不知何处去&#xff0c;桃花依旧笑春风。

UART驱动学习三(TTY驱动部分源码解析)

目录 全局框架图一、tty_io.c 分析1. 关键数据结构和定义2. 文件操作结构体3. 初始化和注册4. 读写操作5. 挂起和恢复6. 信号处理7. 设备类8. 控制台通知9. 辅助函数10. 代码功能11. 带有注释的部分tty_io.c源码 二、tty_ldisc.c 分析1. 关键数据结构和定义2. 行规程操作函数3.…

从零开始打造华丽的国庆生活记录本地HTML网站

目录 目录 前言 准备工作 所需工具 文件夹结构 基础知识入门 HTML基础 CSS基础 JavaScript基础 步骤详解 1. 创建项目文件夹 2. 编写HTML文件 3. 添加CSS样式 4. 增加交互功能 5. 添加图片和视频 6. 美化网站 7. 实现响应式设计 8. 测试与优化 附加功能 创建…

Windows 搭建 Gitea

一、准备工作 1. 安装 Git&#xff1a;Gitea 依赖 Git 进行代码管理&#xff0c;所以首先需要确保系统中安装了 Git。 下载地址&#xff1a;https://git-scm.com/downloads/win 2. 安装数据库&#xff08;可选&#xff09; 默认情况下&#xff0c;Gitea 使用 SQLite 作为内…

【springboot】使用代码生成器快速开发

接上一项目&#xff0c;使用mybatis-plus-generator实现简易代码文件生成 在fast-demo-web模块中的pom.xml中添加mybatis-plus-generator、freemarker和Lombok依赖 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator&…

Windows 11:如何轻松安装或卸载 Copilot 应用(多种方法)

起初&#xff0c;Copilot 是一个与 Windows 11 和 Windows 10 系统紧密结合的内置 AI 助手&#xff0c;能够通过回答问题、调整系统设置等功能来提高你的工作效率。 但从 Windows 11 24H2 开始&#xff0c;Copilot 功能已经从系统中剥离出来&#xff0c;成了一个基于 Microsoft…

【kubernetes】环境准备及K8S二进制安装【最新最全】

一,规划 1,架构 主节点(3台 master)+ 工作节点 (1台 node1) Pod网段: 10.0.0.0/16 Service网段: 10.255.0.0/16 实验环境规划: 操作系统:centos7.6 配置: 4Gib内存/6vCPU/100G硬盘 注意:也可以用4vCPU 网络:NAT 开启虚拟机的虚拟化: 2,K8S集群角色 Ip 主机名…

【嵌入式实时操作系统开发】智能家居入门4(FreeRTOS、MQTT服务器、MQTT协议、STM32、微信小程序)

前面已经发了智能家居入门的1、2、3了&#xff0c;在实际开发中一般都会使用到实时操作系统&#xff0c;这里就以FreeRTOS为例子&#xff0c;使用标准库。记录由裸机转到实时操作系统所遇到的问题以及总体流程。相较于裸机&#xff0c;系统实时性强了很多&#xff0c;小程序下发…