数据结构—(java)反射,枚举,lambda表达式

文章目录

  • 反射
    • 反射的定义:
    • 反射相关的类:
    • 反射相关的方法:
    • 反射示例:
      • 获取Class类对象
      • 创建指定类的对象
      • 反射私有属性:
      • 反射私有方法:
      • 反射私有的构造方法
  • 枚举
    • 枚举的意义
    • 枚举类的实现
    • 枚举类的使用:
    • Enum类中常用的四个方法:
    • 枚举与反射:
  • lambda表达式
    • 函数式接口:
    • lambda表达式的语法:
    • lambda表达式的使用:
    • 关于lambda表达式语法精简的问题:
    • java集合类与lambda表达式的使用问题:
  • 变量捕获:


反射

反射的定义:

java的反射机制是指,在程序的运行状态中,对于任意一个类,可以获取这个类的全部信息(包括,类加载器(后面会学到),构造方法,成员属性,成员方法等。)对于任意一个对象,我们也能够调用其属性与方法进行修改信息,这种动态地获取信息与动态地调用对象的机制,我们称为反射机制。

反射相关的类:

在这里插入图片描述

反射相关的方法:

在Class类中即包含了获取类加载器,创建指定类对象,获取构造方法,属性,成员方法的方法,如下图所示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

反射示例:

获取Class类对象

此处的Class并不是指表示类名的关键字,而是指Class这个具体的类,
因为Class类的构造方法是私有方法,所以不能够直接实例化对象。
我们需要获取Class类对象有三种方式:
第一种:调用对象的getClass方法

        Student student = new Student();//getClass方法也是用c/c++代码实现的Class<Student> c1 = (Class<Student>) student.getClass();

第二种:直接调用类名的class属性

 但是我们并没有在Student中定义class属性//这说明每一个方法都有一个默认的class属性
   Class c2 = Student.class;

第三种:通过class对象的ForName方法来获取

   Class c3 = null ;c3 = Class.forName("reflectDemo.Student");

判断这三个class对象是不是同一个对象。

        System.out.println(c1 ==c2);System.out.println(c1==c3);System.out.println(c2==c3);

在这里插入图片描述
结果表明,我们通过三种方式创建的三个Class对象实际上是一个,

实际上是因为任何一个类在JVM中只会被加载一次,所以其所对应的Class对象也
只会被创建一次。如果通过两个不同的类来创建Class对象,则这两个Class对象不一样。
    Class c2 = Dog.class;

结果为:此时c2与c1,c3均不相同。
在这里插入图片描述

创建指定类的对象

使用的Student类

public class Student {//私有属性nameprivate String name = "bit"; //公有属性agepublic int age = 18;//不带参数的构造方法public Student(){System.out.println("Student()");}private Student(String name,int age) {this.name = name;this.age = age;System.out.println("Student(String,name)");}private void eat(){System.out.println("i am eat");}public void sleep(){System.out.println("i am pig");}private void function(String str) {System.out.println(str);}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +
'}';}}

通过反射实例化对象的方法:

  public static void reflectNewInstance() throws   ClassNotFoundException, InstantiationException, IllegalAccessException {Class c3 = null ;c3 =     Class.forName("reflectDemo.Student");//要通过c3对象来调用实例化对象的方法Student student1 = (Student) c3.newInstance();System.out.println(student1);}

调用此方法。

 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {//通过class对象创建一个学生对象reflectNewInstance();}

在这里插入图片描述

反射私有属性:

//简写了
public class Student {//私有属性nameprivate String name = "bit"; //公有属性agepublic int age = 18;

反射私有属性的方法:

public static void reflectPrivateField(){Class c3 = null ;try {c3 =   Class.forName("reflectDemo.Student");Field field =  c3.getDeclaredField("name");//我们可以修改这个私有属性的值field.setAccessible(true);//还需要有一个Student对象,Student student3 = (Student)c3.newInstance();field.set(student3,"张三");System.out.println(student3);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}
}
  public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateField();}

在这里插入图片描述

反射私有方法:

public class Student {
private void eat(String s){System.out.println(s);}}
public static void reflectPrivateMethod(){Class  c4 = null;try {c4 = Class.forName("reflectDemo.Student");//在有参数时一定要加上参数类型的classMethod method = c4.getDeclaredMethod("eat",String.class);Student student4 = (Student) c4.newInstance();method.setAccessible(true);method.invoke(student4, "i am eat");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}
}
 public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateMethod();}

在这里插入图片描述

反射私有的构造方法

public class Student {private Student(String name,int age) {this.name = name;this.age = age;System.out.println("Student(String,name)");}
}
 public static void reflectPrivateConstructor(){Class c3 = null ;try {c3 =     Class.forName("reflectDemo.Student");//调用getConstructor方法,参数为Constructor<Student> constructor =  c3.getDeclaredConstructor(String.class,int.class);//在获取了构造方法之后呢?constructor.setAccessible(true);//直接调用此构造方法,为对象赋值Student student2 =    constructor.newInstance("张三",15);System.out.println(student2);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}
  public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {reflectPrivateConstructor();}

在这里插入图片描述

枚举

枚举的意义

枚举是将一组常量组织起来,即将这一组常量赋予特殊的意义,用特殊的类型表示它们。
所用的场景为:错误状态码,消息类型,颜色的划分,状态机等等…

枚举类的实现

枚举类有自己特定的关键字即enum,
在这里插入图片描述
所有我们自己定义的枚举类均继承于java提供的Enum类。

枚举类的使用:

在类中定义枚举成员:

public enum Myenum {//在自定义的枚举类中定义一些成员Red,Yellow,Blue,Green;
}

获取枚举成员:

public enum Myenum {//在自定义的枚举类中定义一些成员Red,Yellow,Blue,Green;public static void main(String[] args) {
//我们可以通过枚举类名,来直接获取枚举成员,而不需要创建枚举类的对象。System.out.println(Myenum.Blue);}
}

关于枚举类的构造方法:
在这里插入图片描述
:因为枚举类型的构造方法是私有的,所以不能够在其他类中进行
创建对象,但是在枚举类中也不能够创建枚举类对象,
在这里插入图片描述
枚举类的使用意义并不在于它的对象,而在于它的枚举成员,其枚举成员可以直接通过类名调用。

Enum类中常用的四个方法:

在这里插入图片描述
因为我们定义的枚举类继承于Enum类,所以Enum类中的所有方法均可使用

public static void main(String[] args) {//关于枚举类中方法的使用//1. values方法,用于获取枚举类中所有的枚举成员。//问题:在Enum类中并没有values方法,那么这个方法是从哪里来的?Myenum[] myenums = Myenum.values();for (Myenum myenum2: myenums) {//在获取了每个枚举成员后,开始进行每个枚举成员的索引位// 2. 调用ordinal方法System.out.println(  myenum2  +" "+myenum2.ordinal());}// 3.  valueof方法,将普通的字符串转换成枚举实例?//    System.out.println(Myenum.valueOf("GREEN"));//意思为:如果在枚举类中有此枚举成员,则会返回对应的枚举成员,如果没有则报异常System.out.println("Red");// 4. 第四个方法:compareTo方法//在Enum类中实现了comparable接口,实现了compareTo方法,用于比较两个//枚举成员的索引位置。System.out.println(Red.compareTo(Blue));}

在这里插入图片描述

枚举与反射:

我们不能够通过枚举的构造方法来实例化枚举类对象,那么能否通过反射机制来创建枚举类对象呢?
实际上是不行的。
Enum类中的构造方法:
在这里插入图片描述

public static void main(String[] args)  {//尝试通过反射进行实例化enum对象Class<?> c1 = null;try {//要注意当父类的构造方法未调用时,子类的构造方法是不能被调用的c1 = Class.forName("enumdemo.Myenum");//枚举类不能够通过反射类进行创建。//在指定的类的具有父类时,也应该加上父类形参类型的.class属性Constructor  constructor=   c1.getDeclaredConstructor(String.class,int.class,int.class,String.class);//获取了相应的构造方法后constructor.setAccessible(true);Myenum myenum = (Myenum) constructor.newInstance(2,"hong");} catch (ClassNotFoundException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}

运行结果:
在这里插入图片描述

lambda表达式

函数式接口:

如果一个接口中只有一个抽象方法,则此接口称为函数式接口。
lambda表达式可代替函数式接口的实现,直接将lambda表达式赋给接口类型的变量。

lambda表达式的语法:

如 : (parameters) -> expression 或 (parameters) ->{ statements; }
. paramaters:类似方法中的形参列表,这里的参数是函数式接口里的参数。这里的参数类型可以明确的声明
也可不声明而由JVM隐含的推断。另外当只有一个推断类型时可以省略掉圆括号。
2. ->:可理解为“被用于”的意思
3. 方法体:可以是表达式也可以代码块,是函数式接口里方法的实现。代码块可返回一个值或者什么都不反
回,这里的代码块块等同于方法的方法体。如果是表达式,也可以返回一个值或者什么都不返回。

lambda表达式的使用:

interface NoParameterNoReturn{//无参且无返回值void test();
}
interface OneParameterNoReturn{//有一个参数无返回值void test(int a);
}
interface MultipleParameterNoReturn{//有多个参数无返回值void test(int a,int b);
}
interface NoParameterReturn{//无参且有返回值int test();
}
interface OneParameterReturn{//有一个参数有返回值int  test(int a);
}
interface MultipleParameterReturn{//有多个参数有返回值int  test(int a,int b);
}public static void main(String[] args) {//Lambda表达式可用于实现只有一个抽象方法的接口。//先实现无返回值无参数的接口NoParameterNoReturn noParameterNoReturn1 = new NoParameterNoReturn() {@Overridepublic void test() {System.out.println("调用无返回值无参数方法");}};//直接调用方法noParameterNoReturn1.test();//我们采用lambda表达式,直接赋给noParameterNoReturns变量NoParameterNoReturn noParameterNoReturn2 = ()->{ System.out.println("调用无返回值无参数方法");};noParameterNoReturn2.test();}

在这里插入图片描述
此两种方式效果相同。

 public static void main(String[] args) {//调用一个无参有返回值的方法NoParameterReturn noParameterReturn = ()->10;  //可以不写return 关键字,直接写数值或语句System.out.println(noParameterReturn.test());}

在这里插入图片描述

关于lambda表达式语法精简的问题:

  1. 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
  2. 参数的小括号里面只有一个参数,那么小括号可以省略
  3. 如果方法体当中只有一句代码,那么大括号可以省略
  4. 如果方法体中只有一条语句,且是return语句,那么大括号可以省略,且去掉return关键字。

java集合类与lambda表达式的使用问题:

在这里插入图片描述
在这里插入图片描述

public static void main(String[] args) {//举例:ArrayList中的forEach语句ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(10);arrayList.add(20);arrayList.add(15);//遍历数组可以用迭代器,foreach语句等,也可以采用arrayList本身的方法//accept是接口中的抽象方法,将其重写//方法1:直接创建匿名内部类调用。arrayList.forEach(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) {System.out.println(integer);}});// 方法2:通过lambda表达式//当我们这样编写时,代码很简洁,但是可读性比较差。arrayList.forEach((a)->{System.out.println(a);});}
 public static void main(String[] args) {//举例: List中的sort方法ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(10);arrayList.add(20);arrayList.add(15);/* arrayList.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});*/// System.out.println(arrayList);arrayList.sort(((o1, o2) -> {return o1.compareTo(o2);}));System.out.println(arrayList);}

变量捕获:

    //变量捕获是指在匿名内部类,或lambda表达式中,所使用的变量在此之前与之后不能被修改,或者此变量被final修饰

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

机器学习算法与实践_03概率论与贝叶斯算法笔记

1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目&#xff0c;是通过对 样本 的分析&#xff0c;来评估/估计 总体 的情况&#xff0c;与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一&#xff1a;窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数&#xff1a;求和 min函数 &#xff1a;最小值 1.2. 排序函数 1.3. 跨行函数…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

数据结构之二叉树(1)

数据结构之二叉树&#xff08;1&#xff09; 一、树 1、树的概念与结构 &#xff08;1&#xff09;树是一种非线性的数据结构&#xff0c;由n(n>0)个有限结点组成一个具有层次关系的集合。 &#xff08;2&#xff09;树有一个特殊的结点&#xff0c;叫做根结点&#xff…

【记录】C++学习路线

一、记录心得&#xff1a; 目前自己的状况是刚上大三&#xff0c;学校是双非一本&#xff0c;教的主流方向是 J A V A JAVA JAVA开发方向&#xff0c;还有就是嵌入式方向&#xff0c;这两个方向自己都不是很感兴趣&#xff0c;所以从大一开始就自学 C C C&#xff0c;加入 A…

图的应用(拓扑排序)

自己设计一个不少于6个结点的带权有向无环图&#xff0c;并画出其邻接矩阵的样子 用一维数组将你设计的有向无环图的邻接矩阵进行压缩存储 文字描述&#xff1a;基于你压缩存储的数组&#xff0c;如何判断结点 i、j 之间是否有边&#xff1f; 基于你设计的带权有向无环图&#…

flash_attention简要笔记

优化效果 原来&#xff0c;attention部分的计算量和中间激活占用显存的复杂度都是 O ( N 2 ) O(N^2) O(N2) 计算量部分原来QK矩阵乘和attn_scoreV矩阵乘的计算量&#xff0c;复杂度都是 O ( N 2 ) O(N^2) O(N2)&#xff1b;中间激活因为中间有一个attn_score&#xff0c;所以复…

基于yolov8的战斗机类型识别检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 YOLOv8是Ultralytics公司推出的最新一代对象检测模型&#xff0c;它在目标检测领域展现了前所未有的先进性能。基于YOLOv8的战斗机类型识别检测系统&#xff0c;通过结合深度学习技术和卷积神经网络&#xff08;CNN&#xff09;&#xff0c;实现了对战斗机图像的…

八股文-多线程、并发

八股文-多线程、并发 最近学到了一种方法&#xff0c;可以用于简历项目经验编写以及面试题目的回答 STAR法则&#xff1a;在什么背景下&#xff0c;你需要解决什么问题&#xff0c;你做了啥&#xff0c;得到了什么结果 情境&#xff08;Situation&#xff09;&#xff1a; 描…

软件测试分类篇(上)

目录 引言&#xff1a; 一、为什么要对软件测试进行分类 二、按照测试目标分类 1. 界面测试 2. 功能测试 3. 性能测试 4. 可靠性测试 5. 安全性测试 6. 易用性测试 三、按照执行方式分类 1. 静态测试 2. 动态测试 四、按照测试方法分类 1. 白盒测试 2. 黑盒测试 …

HTTP 教程

HTTP/HTTPS 简介 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;和 HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff0c;超文本传输安全协议&#xff09;是用于在网络中传输信息的两种主要协议。它们定义了客户端和服务器…

10.1 溪降技术:通讯

目录 10.1 通讯概述观看视频课程电子书&#xff1a;通讯视觉信号想象一下…… 声音信号总结 10.1 通讯 概述 两名队友讨论下一个跳点 溪降是一项团队活动&#xff0c;需要团队成员之间良好的沟通。由于溪降所处的环境特性&#xff0c;往往使得声音通讯变得困难。环境可能非常嘈…

自动化测试常用函数

目录 一、元素的定位 1、cssSelector 2、xpath &#xff08;1&#xff09;xpath 语法 1、获取HTML页面所有的节点 2、获取HTML页面指定的节点 3、获取一个节点中的直接子节点 4、获取一个节点的父节点 5、实现节点属性的匹配 6、使用指定索引的方式获取对应的节点内容…

欧美海外仓系统有哪些服务商选择?

在跨境电商的全球化浪潮中&#xff0c;欧美市场以其成熟的电商生态和庞大的消费群体&#xff0c;成为了众多跨境卖家竞相争夺的高地。为了提升物流效率、降低成本并增强客户体验&#xff0c;海外仓成为了不可或缺的一环。而海外仓系统的选择&#xff0c;则直接关系到仓库的运营…

排序-----选择排序

首先介绍几种排序的分类&#xff1a; 选择排序是每次都遍历&#xff0c;标记出最小的元素&#xff0c;然后把它放在前面。 本文介绍优化后的版本&#xff1a;每次遍历标记出最小的和最大的元素&#xff0c;分别放到前面和后面。&#xff08;注意这里是找到对应的下标&#xff0…

数据结构与算法——Java实现 6.递归

要学会试着安静下来 —— 24.9.17 一、递归的定义 计算机科学中&#xff0c;递归是一种解决计算问题的方法&#xff0c;其中解决方案取决于同一类问题的更小子集 说明: ① 自己调用自己&#xff0c;如果说每个函数对应着一种解决方案&#xff0c;自己调用自己意味着解决方案是…

2024/9/20 使用QT实现扫雷游戏

有三种难度初级6x6 中级10x10 高级16x16 完成游戏 游戏失败后&#xff0c;无法再次完成游戏&#xff0c;只能重新开始一局 对Qpushbutton进行重写 mybutton.h #ifndef MYBUTTON_H #define MYBUTTON_H #include <QObject> #include <QWidget> #include <QPus…

jdk版本更换以及遇到的问题略谈(以jdk1.8和jdk11为例)

目录 在我看来 遇到的问题 原因以及解决方法 方法一&#xff1a;禁止误改误删 方法二&#xff1a;bat文件驱动运行 方法三&#xff1a;cmd命令 方法四&#xff1a;修改注册表&#xff08;不推荐&#xff09; 最近在进行漏洞复现&#xff08;shiro550&#xff09;的时候&…

DAY20信息打点-红蓝队自动化项目资产侦察武器库部署企查产权网络空间

2.自动化-网络空间-AsamF 1.去GitHub上下载项目之后使用CMD打开 2.输入命令AsamF_windows_amd64.exe -v生成配置文件 3.AsamF会在~/.config/asamf/目录下生成config.json文件 C:\Users\Acer\.config\asamf 5.根据文档输入命令去查询所需信息&#xff08;已经没有用了&#x…

jeecg自定义sql查询,并使用高级查询的参数

jeecg框架的高级查询界面如下 后台代码&#xff1a; controller层&#xff1a; GetMapping(value "/list")public Result<IPage<Receiver>> queryPageList(Receiver receiver,RequestParam(name"pageNo", defaultValue"1") Integ…