数据结构—(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表达式语法精简的问题:
- 参数类型可以省略,如果需要省略,每个参数的类型都要省略。
- 参数的小括号里面只有一个参数,那么小括号可以省略
- 如果方法体当中只有一句代码,那么大括号可以省略
- 如果方法体中只有一条语句,且是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修饰


相关文章:
数据结构—(java)反射,枚举,lambda表达式
文章目录 反射反射的定义:反射相关的类:反射相关的方法:反射示例:获取Class类对象创建指定类的对象反射私有属性:反射私有方法:反射私有的构造方法 枚举枚举的意义枚举类的实现枚举类的使用:Enu…...
机器学习(西瓜书)第 14 章 概率图模型
14.1 隐马尔可夫模型 机器学习最重要的任务,是根据一些已观察到的证据(例如训练样本)来对感兴趣的未知变量(例如类别标记)进行估计和推测。概率模型(probabilistic model)提供了一种描述框架&a…...
Python异步编程-asyncio详解
目录 asyncio简介示例什么是 asyncio?适用场景API asyncio的使用可等待对象什么是可等待对象?协程对象任务对象Future对象 协程什么是协程?基本使用运行协程 Task什么是 Task?创建 Task取消 TaskTask 异常获取Task 回调 TaskGroup什么是 Tas…...
UniApp如何打包成客户端应用程序
像flutter是支持PC宽屏、桌面平台(Windows/macOS/Linux),我一直在期望UniApp什么时候也支持PC,桌面平台,终于盼到了。 1、支持PC宽屏 从uni-app 2.9起,支持PC宽屏的适配。 uni-app提供的屏幕适配方案&am…...
你应该掌握的12条饭局规矩!
在职场的舞台上,饭局不仅仅是一场简单的聚餐,它是一场精心编排的社交盛宴,是展示个人魅力、构建人脉网络的重要平台。精通饭局的艺术,能让你在职场的交际中更加自如。以下是酱酒亮哥整理的12条饭局指南,希望你在职场的…...
【541. 反转字符串 II 简单】
题目: 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,…...
基于PHP的丽江旅游管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的丽江旅游管理系统 一 介绍 此丽江旅游系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈:phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…...
vue3+Element-plus el-input 输入框组件二次封装(支持金额、整数、电话、小数、身份证、小数点位数控制,金额显示中文提示等功能)
一、效果图 二、组件集成了以下功能 1、输入金额--支持千分号显示、可设置decimalLimit来调整小数点位数 2、金额鼠标移入提示中文--标签添加isTip开启中文提示则不允许开启千分号显示showThousands 3、输入手机号--设置inputTypephone 4、输入整数---设置inputTypeinteger 5、…...
jQuery 简介 ③ ready()事件函数、jQuery 二个原则及容错机制
文章目录 jQuery 简介 ③五、ready() 准备就绪时执行代码六、jQuery 核心1、Get and Set in One 原则2、Get first Set all 原则3、容错机制:jQuery 简介 ③ 五、ready() 准备就绪时执行代码 如果我们在中引入jQuery库文件,并编写相应的jQuery代码来操作DOM元素。这很可能导…...
选择Alluxio来解决AI模型训练场景数据访问的五大理由
在AI模型训练尤其是大模型领域,存储系统的性能和稳定性直接决定了模型训练、推理、部署任务的效率和成本。随着全球AI行业的爆发带来的数据规模的快速增长,如何高效管理和利用这些数据成为AI模型训练中的一大挑战。 AI模型训练场景面临的五大难题 1. 数…...
POS共识机制简介
权益证明(Proof of Stake, PoS)共识机制基础 1. 引言 权益证明(Proof of Stake, PoS)是一种用于区块链网络的共识机制,旨在解决工作量证明(Proof of Work, PoW)机制中存在的能源消耗高、中心化…...
Spring为什么要用三级缓存解决循环依赖?
Spring为什么要用三级缓存解决循环依赖? 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存:单例池,经历过完整bean生命,单例Bean对象2.2 二级缓存:提前暴露的Bean2.3 三级缓存:打破循环 3. S…...
【Redis入门到精通三】Redis核心数据类型(List,Set)详解
目录 Redis数据类型 编辑 1.List类型 (1)常见命令 (2)内部编码 2.Set类型 (1)常见命令 (2)内部编码 Redis数据类型 查阅Redis官方文档可知,Redis提供给用户的核…...
本科生如何学习机器学习
一、入门阶段 1. 数学与统计学基础 高等数学:学习微积分、极限、级数等基本概念。线性代数:掌握矩阵运算、特征值和特征向量、线性方程组等。概率论与统计学:理解概率分布、假设检验、贝叶斯定理等统计知识。 2. 编程语言学习 Python&…...
海康威视摄像机和录像机的监控与回放
文章目录 海康威视摄像机和录像机的监控与回放1、海康威视监控设备简介1.1、摄像机二次开发1.1.1:协议选择 1.2:web集成1.2:标准协议对接1.2.1:ffmpeg软件转流1.2.2:开源监控软件shinobi1.2.2.1 安装使用1.2.2.2 shino…...
校医务室健康服务系统小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,医生管理,医患交流管理,预约医生管理,健康打卡管理,运动打卡管理,饮食打卡管理 微信端账号功能包括:系统首…...
MySQL 中的 UTF-8 与 UTF8MB4:差异解析
在 MySQL 数据库中,字符集的选择对于数据的存储和处理至关重要。其中,UTF-8 和 UTF8MB4 是两个常见的字符集选项。那么,它们之间到底有什么区别呢? 一、字符集简介 UTF-8 UTF-8(8-bit Unicode Transformation Format&…...
nvm无法下载npm的问题
1、问题 执行 nvm install 14.21.3 命令,node可以正常下载成功,npm下载失败 2、nvm配置信息 …/nvm/settings.txt root: D:\soft\nvm path: D:\soft\nodejs node_mirror: npmmirror.com/mirrors/node/ npm_mirror: registry.npmmirror.com/mirrors/…...
数据结构与算法——Java实现 6.递归
要学会试着安静下来 —— 24.9.17 一、递归的定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 说明: ① 自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是…...
.Net Core 生成管理员权限的应用程序
创建一个ASP.NET Core Web API项目 给解决方案设置一个名称 选择一个目标框架,这里选择的是 .NET 8.0框架 在Porperties文件夹中添加一个app.manifest文件 设置app.manifest文件属性,生成操作设置为嵌入的资源 双击解决方案名称,编辑WebAppli…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
