反射、枚举和lambda表达式
文章目录
- 一、反射
- 1.1 什么是反射
- 1.2 反射相关的类
- 1.3 示例
- 获取Class对象
- 通过反射去创建对象
- 调用带两个参数且私有的构造方法
- 获取私有属性
- 反射私有方法
- 二、枚举
- 2.1 什么是枚举以及其优缺点
- 2.2 如何使用枚举
- 组织常量的基本方法
- 枚举类的其他方法示例
- 枚举能否通过反射拿到实例对象
- 三、lambda表达式
- 3.1 什么是 lambda表达式
- 3.2 lambda表达式的基本使用
- 关于变量捕获
- 对于自定义函数式接口
- lambda表达式在集合中的使用
一、反射
1.1 什么是反射
- 概念:正常情况下,我们的类是封装起来的,外人除非创建对象,否则无法访问到。但是反射可以让我们知道这个类的所有属性方法以及对于任意一个对象,都能调用它的任意方法和属性
- 是一种特性,和数据结构没有关系
1.2 反射相关的类
- 类:Class类、File类、Method类、Constructor类
- Class类:表示类和接口
- 理解:程序编译之后会变成“Class字节码文件”,然后交给JVM运行,JVM里面都是对象,Class字节码文件也因此会被加载为一个对象,该对象就是我们获取的Class对象,拿到Class对象就可以进行正常的反射了
- File类:表示类的成员变量/属性
- Method类:表示类的方法
- Constructor类:表示类的构造方法
- Class类:表示类和接口
- 相关方法
1.3 示例
获取Class对象
通过反射去创建对象
调用带两个参数且私有的构造方法
获取私有属性
反射私有方法
二、枚举
2.1 什么是枚举以及其优缺点
- 概念:枚举是在 JDK1.5以后引入,可以帮我们组织常量
- 优缺点:
- 优点:
- 枚举常量更简单安全,避免把其他的常量值认为是枚举类型
- 枚举里面有内置方法,使用起来更规范美观
- 枚举可以避免反射和序列化问题,因为其能创造出的实例只有一个,所以使用单例模式的时候是安全的
- 缺点:
- 因为枚举类型的构造方法默认是私有的,所以无法继承,无法扩展,就算继承了也没有什么用
- 优点:
2.2 如何使用枚举
组织常量的基本方法
枚举类的其他方法示例
枚举能否通过反射拿到实例对象
三、lambda表达式
3.1 什么是 lambda表达式
- 概念:是Java8中一个重要的新特性,允许通过表达式来代替功能接口,有点类似于【匿名表达式】
- 表达式形式:有一个正常的参数列表 + 使用这些参数的主体(body,可以是一个表达式或一个代码块)
- 基本语法:
3.2 lambda表达式的基本使用
关于变量捕获
- 概念:lambda表达式和匿名内部类都存在变量捕获,这可以帮我们理解其作用域
对于自定义函数式接口
lambda表达式在集合中的使用
- 集合中可以使用lambda表达式:
- Collection:removeIf()、spliterator()、stream()、parallelStream()、forEach()
- List:replaceAll()、sort()
- Map:getOrDefault()、forEach()、replaceAll()、putIfAbsent()、remove()、computerIfAbsent()、computeIfPresent()、computer()、merge()
2. forEach():
3. sort():