数据结构(Java):反射枚举Lambda表达式

目录

1、反射

1.1 反射的定义

1.2 反射机制的原理

1.3 反射相关类

1.4 Class类

1.4.1 相关方法

1.4.1.1 常用获得类相关的方法

​编辑

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

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

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

1.4.2 获取Class对象

1.5 总结

1.6 代码实例

2、枚举

2.1 定义

2.1.1 简单使用

2.2 常用方法

2.3 构造方法

2.4 枚举和反射(阿里面试:为什么枚举实现单例模式是安全的?)

 2.5 总结

3、Lambda表达式

3.1 定义

3.2 函数式接口

3.3 省略规则

3.4 变量捕获

 3.5 Lambda表达式在集合中的使用

3.5.1 forEach循环

3.5.1.1 Collection集合

3.5.1.2 Map集合

3.5.2 sort排序-forEach循环

3.5.2.1 List集合


1、反射

1.1 反射的定义

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

简单来说,反射就是在运行的状态下,能够看清类的基本信息。

我们可以这样理解:在安检时,我们把行李箱放在安检的机器上,这时,不管行李箱里面有什么东西,哪怕是私密的东西,也可以被看的一清二楚。

1.2 反射机制的原理

一个.java文件经过编译会生成.class字节码文件,在运行时,这个字节码文件又会被JVM解析成一个Class类的对象,程序在运行时,每个java文件最终就会变成Class类对象的一个实例,我们就可以通过这个Class类来获取或修改类的基本信息。

也就是说,在反射之前,我们需要做的第一步就是先拿到当前需要反射的类的Class对象(见下文),然后通过Class对象的核心方法,达到反射的目的, 

1.3 反射相关类

要想实现反射,我们必须了解以下类: 

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

1.4 Class类

1.4.1 相关方法

1.4.1.1 常用获得类相关的方法

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

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

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

1.4.2 获取Class对象

  1.  第一种,使用 Class.forName("类的全路径名"); (静态方法)(常用)                                  例:Class<?> c1 = Class.forName("reflectdemo.Student");

  2. 使用 .class 方法。                                                                                                              例:Class c2 = Student.class;

  3. 使用类对象的 getClass() 方法。                                                                                         例:Student student = new Student();Class<?> c3 = student.getClass();

1.5 总结

反射优点:

  1. 对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。
  2.  增加程序的灵活性和扩展性,降低耦合性,提高自适应能力。
  3. 反射已经运用在了很多流行框架如:Struts、Hibernate、Spring 等等。 

反射缺点:

  1. 调用大量方法,导致程序效率降低 。
  2. 会带来维护问题。
  3. 反射代码比相应的直接代码更复杂 。

1.6 代码实例

public static void reflectPrivateField() {try {Class<?> c1 = Class.forName("reflectdemo.Student");Field field = c1.getDeclaredField("name");field.setAccessible(true);//修改private修饰的成员,需要添加这条语句//获取Student对象Student student = (Student)c1.newInstance();field.set(student,"poll");System.out.println(student);} catch (ClassNotFoundException e) {throw new RuntimeException(e);} catch (NoSuchFieldException e) {throw new RuntimeException(e);} catch (InstantiationException e) {throw new RuntimeException(e);} catch (IllegalAccessException e) {throw new RuntimeException(e);}}

2、枚举

2.1 定义

枚举的使用语法:用enum代替class关键字,定义一个枚举类。枚举类实际上就是一个类。

其中的RE、 BLACK、GREEN ,叫做枚举对象

能够将常量组织起来统一进行管理,不具备整形等值的概念,是枚举类型。

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

2.1.1 简单使用

public enum Color {RED,PICK,BLACK,BLUE;//枚举对象public static void main(String[] args) {Color color = RED;switch (color) {case RED :System.out.println(RED);break;case BLACK :System.out.println(BLACK);break;case PICK:System.out.println(PICK);break;case BLUE:System.out.println(BLUE);break;default:System.out.println("null");break;}}
}

2.2 常用方法

因为任何的自定义枚举类都继承自Enum类,故继承了Enum类的方法:

其中 valueOf方法,只能转化成已有的枚举对象。

方法使用:

public enum Color {RED,PICK,BLACK,BLUE;//枚举对象public static void main(String[] args) {Color[] colors = Color.values();//将枚举对象转化为数组for (Color color : colors) {System.out.println(color+" "+color.ordinal());//获取索引}System.out.println("====");Color color = Color.valueOf("RED");//将字符串转化为枚举对象(只能转化成已有的枚举对象)System.out.println(color);System.out.println("===");System.out.println(RED.compareTo(PICK));//比较枚举对象的定义顺序(下标差)}    
}

2.3 构造方法

因为枚举本身就是一个类,所以也有普通类所具备的构造方法。

当我们没有写出任何构造方法时,Java会帮我们默认提供不带参数的构造方法,所以我们实例出的枚举对象不用传入参数。但是当我们写出带参构造时,我们就需要自主给枚举对象提供相应参数。

但是这里重点要说的是:枚举的构造方法默认是私有的。

我们发现,当private修饰构造方法时,private显示为灰色(上图),说明构造方法默认是私有的,当我们使用public修饰时,会编译报错:

2.4 枚举和反射(阿里面试:为什么枚举实现单例模式是安全的?)

我们上文讲到了反射可以拿到类中所有的属性和方法,包括private私有的,那么枚举的构造方法也是私有的,我们是否可以拿到呢?

答案是:反射不可以拿到枚举的构造方法。

 

 当我们通过反射(newInstance方法中)去获取枚举对象时,直接抛出了异常,也就是说,在反射中,枚举被过滤掉了,所以我们不能通过反射获取枚举类的实例!!!

总结:枚举是非常安全的,甚至不可以用反射获取枚举的实例。 

 2.5 总结

  1. 枚举本身就是一个类,其构造方法默认为私有的,且都是默认继承与 java.lang.Enum
  2. 枚举的构造方法默认是私有的
  3. 枚举可以避免反射和序列化问题
  4. 枚举常量更简单安全
  5. 枚举不可继承,无法扩展

3、Lambda表达式

3.1 定义

Lambda表达式是JDK8引入的一种语法形式,主要用来简化代码,语法为:

3.2 函数式接口

Lambda表达式主要用来简化匿名内部类的书写,而且只能简化函数式接口的匿名内部类的书写。

函数式接口:

  • 有且仅有一个抽象方法的接口
  • 我们可以为函数式接口添加@FunctionalInterface 注解,当其不是函数式接口时,编译器会报错。

所以我们可以这样理解Lambda表达式:Lambda就是匿名内部类的简化,实际上是创建了一个匿名类的对象,实现了函数式接口,重写了接口的方法 。 

3.3 省略规则

  • 省略所实现接口的表示,省略方法名、返回值,只保留重写方法的参数列表和方法体

  • 参数类型可省略,若要省略则全部参数的类型都要省略

  • 若只有一个参数,那么参数的小括号可省略;若有两个参数,则小括号不可省略。

  • 参数和方法体间使用 -> 连接

  • 若方法体当中只有一句代码,那么花括号可以省略,分号可以省略

  • 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字,去掉分号

代码演示:

public static void main(String[] args) {//原匿名内部类形式PriorityQueue<String> queue1 = new PriorityQueue<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o2.compareTo(o1);}});//Lambda表达式形式PriorityQueue<String> queue2 = new PriorityQueue<>((o1,o2) -> o2.compareTo(o1));}

3.4 变量捕获

变量捕获就是在匿名内部类中使用到了一个变量,那这个变量在使用前或者使用后都不能做出修改,否则会编译报错(这个变量就叫做被捕获的变量):

在匿名内部类中存在变量捕获,那么在Lambda表达式中也必然存在:

 

上述代码中变量aaaa就叫做:被捕获的变量 

所以我们得出结论:

  1. 这个变量要么是被final修饰为常量(常量不可修改)。
  2. 如果不是被final修饰的,我们要保证在使用之前和使用之后,没有修改。

 3.5 Lambda表达式在集合中的使用

3.5.1 forEach循环

forEach循环需要使用匿名内部类重写方法,我们可以使用Lambda表达式来简化代码。

3.5.1.1 Collection集合
public static void main1(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(23);list.add(29);list.add(13);//原形式list.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.print(integer+" ");}});System.out.println();//Lambda形式list.forEach(integer -> System.out.print(integer+" "));}
3.5.1.2 Map集合
public static void main(String[] args) {HashMap<String,Integer> map = new HashMap<>();map.put("hello",10);map.put("world",13);map.put("abc",20);map.forEach(new BiConsumer<String, Integer>() {@Overridepublic void accept(String s, Integer integer) {System.out.println(s+" "+integer+" ");}});//Lambda形式map.forEach((key,value) -> System.out.println(key+" "+value+" "));

3.5.2 sort排序-forEach循环

3.5.2.1 List集合

List集合的sort方法,也可以使用匿名内部类重写方法来排序,我们可以使用Lambda形式:

public static void main2(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(23);list.add(29);list.add(13);//原匿名内部类排序形式/*list.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});*///Lambda形式 ->排序list.sort((o1, o2) -> o1.compareTo(o2));//Lambda形式 ->forEach循环list.forEach(integer -> System.out.print(integer+" "));}

END

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

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

相关文章

linux进程——虚拟地址空间——重新认识进程!!!

前言&#xff1a; 本节内容就将进入linux进程里面的又一个大板块&#xff0c; 博主认为这个板块和PCB的板块是平级——两者独立&#xff1b;之前友友们可能认为进程分为PCB和代码与数据。 但是本节过后&#xff0c; 我们可以对进程重新定义——进程 &#xff08;PCB&#xff0…

深入理解计算机系统 CSAPP 家庭作业11.8

回收子进程是书本537页的内容 在tiny.c文件加以下代码,记得重新编译哦 书中提到CGI是在动态内容中的,所以题目的意思应该是在动态内容里面回收 void handler1(int sig) {int olderrno errno;while (waitpid(-1,NULL,0)>0){Sio_puts("Handler reaped child\n");…

【秋招突围】2024届秋招笔试-OPPO笔试题-第一套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新 OPPO 春秋招笔试题**汇总&#xff5e; &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; ✨ 笔试合集传送们 -> &#x1f9f7;春秋招笔试合集 &#x1f380; 01.K小姐的快…

DVWA中命令执行漏洞细说

在攻击中&#xff0c;命令注入是比较常见的方式&#xff0c;今天我们细说在软件开发中如何避免命令执行漏洞 我们通过DVWA中不同的安全等级来细说命令执行漏洞 1、先调整DVWA的安全等级为Lower,调整等级在DVWA Security页面调整 2、在Command Injection页面输入127.0.0.1&…

【计算机网络】物理层(第2章)大纲(共70+页)

最后只复习了1.5天&#xff0c;应用层简单过了一遍。 本来是mindmap的&#xff0c;但是太大了只能导出成提纲了&#xff0c;凑合看吧orz。 如果你找我要源文件&#xff0c;最好是在2024年&#xff0c;不然我可能就找不到了&#xff08;&#xff09;。

C# Task.WaitAll 的用法

目录 简介 1.WaitAll(Task[], Int32, CancellationToken) 2.WaitAll(Task[]) 3.WaitAll(Task[], Int32) 4.WaitAll(Task[], CancellationToken) 5.WaitAll(Task[], TimeSpan) 结束 简介 Task.WaitAll 是 C# 中用于并行编程的一个的方法&#xff0c;它属于 System.Threa…

蓝牙耳机百元之内怎么选?四款百元精品爆款蓝牙耳机盘点

在蓝牙耳机的海洋中&#xff0c;百元价位仿佛是一片神秘的绿洲&#xff0c;既诱人又充满未知&#xff0c;如何在众多选项中挑选出真正的精品呢&#xff1f;蓝牙耳机百元之内怎么选&#xff1f;这是许多消费者的共同疑问&#xff0c;带着这个疑问&#xff0c;作为蓝牙耳机发烧党…

2024101读书笔记|《飞花令·冬》——三冬雪压千年树,四月花繁百尺藤

2024101读书笔记|《飞花令冬》——三冬雪压千年树&#xff0c;四月花繁百尺藤 《飞花令冬&#xff08;中国文化古典诗词品鉴&#xff09;》素心落雪 编著&#xff0c;飞花令得名于唐代诗人韩翃《寒食》中的名句“春城无处不飞花”&#xff0c;类似于行酒令&#xff0c;是文人们…

在Mac上恢复永久删除的Excel文件,有效方法学习!

丢失 Mac 上的重要 Excel 文件可能是一场噩梦&#xff0c;尤其是如果它们被永久删除的话。相信我&#xff0c;这种感觉是没人愿意经历的。但不要惊慌&#xff1b;您可以选择恢复这些文件。无论是通过垃圾箱删除还是由于系统错误意外丢失&#xff0c;都有多种方法可以恢复您的数…

STM32嵌入式人工智能边缘计算应用教程

目录 引言环境准备边缘计算系统基础代码实现&#xff1a;实现嵌入式人工智能边缘计算系统 4.1 数据采集模块 4.2 数据处理与推理模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;边缘计算与优化问题解决方案与优化收尾与总结 1. 引言 嵌入式人工智…

深度学习的前沿主题:GANs、自监督学习和Transformer模型

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;1. 介绍 深度学习在人工智能领域中占据了重要地位&#xff0c;特别是生成对抗网络&#xff08;GANs&#xff09;、自监督学习和Transformer模型的出现&#xff0c;推动了图像生成、自然语言处理等多个领域的创…

Docker Desktop安装(通俗易懂)

1、官网 https://www.docker.com/products/docker-desktop/ 2、阿里云镜像 docker-toolbox-windows-docker-for-windows安装包下载_开源镜像站-阿里云 1. 双击安装文件勾选选项 意思就是&#xff1a; Use WSL 2 instead of Hyper-V (recommended) : 启用虚拟化&#xff0c;…

2024年【非高危行业生产经营单位主要负责人解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力考试报名是安全生产模拟考试一点通生成的&#xff0c;非高危行业生产经营单位主要负责人及安全管理人员安全生产知识和管理能力证模拟考试题库…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

Go-Zero 数据库实战:配置、建模与业务逻辑一体化

前言 在之前的几篇文章中&#xff0c;我们深入学习了Go-Zero框架的实战应用&#xff0c;包括模板定制化、API定义、抽奖算法设计等内容。本文将继续探索Go-Zero框架的实践技巧&#xff0c;并介绍一些与数据库操作相关的主题。 在现代应用程序开发中&#xff0c;对数据库的操作…

matlab仿真 数字基带传输(上)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第六章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all nsamp10;%每个脉冲信号的抽样点数 s0ones(1,nsamp);%基带脉冲信号&#xff0c;其中s0的信号为1,1,1,1,1,1,1,1,1,1 …

【笔记】缺少DLL文件 Cannot import dll:C\Users\xxx\...\madd.dll

报错 原因 杀毒软件拦截了程序解决&#xff1a;关闭该软件 &#xff08;1&#xff09;电脑右下角&#xff08;↑&#xff09;&#xff0c;找到杀毒软件&#xff08;我电脑是 联想杀毒Plus&#xff09; &#xff08;2&#xff09;找到 “更改设置” - 选择 “实时扫描” &#…

vue3 使用Mock

官网: http://mockjs.com/ 安装 npm install mockjs -Dsteps1: main.js 文件引入 import /api/mock.jssteps2: src/api/mock.js import Mock from mockjs import homeApi from ./mockData/home /*** 1.拦截的路径:mock拦截了正常NetWork/网络请求,数据正常响应* 2.方法* …

【计算机网络】DHCP实验

一&#xff1a;实验目的 1&#xff1a;深入理解DHCP&#xff08;动态主机配置协议&#xff09;的工作原理和数据包交换过程。 2&#xff1a;掌握如何通过命令行释放和重新获取IP地址&#xff0c;并通过抓包软件分析DHCP消息的具体内容。 二&#xff1a;实验仪器设备及软件 硬…

猫头虎 分享已解决Error || pip install 出现 error: subprocess-exited-with-error 错误的解决办法

&#x1f42f; 猫头虎 分享已解决Error || pip install 出现 error: subprocess-exited-with-error 错误的解决办法 &#x1f680; 摘要 &#x1f31f; 在人工智能领域开发中&#xff0c;我们常常需要使用不同的包管理工具来管理我们的开发环境。作为技术博主猫头虎&#xff…