当前位置: 首页 > news >正文

【响应式编程-03】Lambda表达式底层实现原理

一、简要描述

  • Lambda的底层实现原理
  • Lambda表达式编译和运行过程

二、Lambda的底层实现原理

  • Lambda表达式的本质

        函数式接口的匿名子类的匿名对象

  • 反编译:cfr-0.145.jar

        反编译:LambdaMetafactory.metafactory()

        跟踪调试,转储Lambda类:

                jdk.internal.lambda.dumpProxyClasses

                LambdaPrinciple$Lambda$1.class

  • 结论

        Lambda底层用匿名内部类实现:ASM技术

        Lambda表达式是个语法糖

三、Lambda表达式编译和运行过程

  • JVM参数:jdk.internal.lambda.dumpProxyClasses
    • 命令java -Djdk.internal.lambda.dumpProxyClasses ClassName
    • 转储得到内部类ClassName$$Lambda$1.class
    • 反编译java -jar cfr-0.145.jar LambdaPrinciple.class --decodelambdas false
  • 本质:函数式接口的匿名子类的匿名对象

        Lambda表达式与函数接口的抽象函数格式一一对应

1、LambdaPrinciple 代码实现

package tech.flygo.lambda.demo4;import java.util.Arrays;
import java.util.List;/*** Lambda表达式的底层实现* 语法:* (parameters) -> { statements; }* 或* (parameters) -> expression** <p>* JVM参数:jdk.internal.lambda.dumpProxyClasses* 命令:java -Djdk.internal.lambda.dumpProxyClasses ClassName* 转储得到内部类:ClassName$$Lambda$1.class* 反编译:java -jar cfr-0.145.jar LambdaPrinciple.class --decodelambdas false* <p>* 本质:函数式接口的匿名子类的匿名对象* Lambda表达式与函数接口的抽象函数格式一一对应*/
public class LambdaPrinciple {public static void main(String[] args) {List<String> stringList = Arrays.asList("one", "two", "three");// 通过lambda表达式实现元素遍历stringList.forEach(s -> {System.out.println(s);});}
}

2、cfr工具包解码Lambda代码实现

CFR解析包

cfr-0.145.jaricon-default.png?t=N7T8https://www.yuque.com/attachments/yuque/0/2023/jar/1509175/1684030971197-5456d0f4-1c6a-45d0-bf96-009ee00cd9cd.jar

2.1、复制cfr工具包到class目录下

2.2、使用Java命令解码Lambda代码实现

  • 进入class目录
  • class和工具包同一级目录
  • 使用java命令解码Lambda实现内容

   java -jar cfr-0.145.jar LambdaPrinciple.class --decodelambdas false

2.3、解码出来的Lambda内容

/** Decompiled with CFR 0.145.*/
package tech.flygo.lambda.demo4;import java.io.PrintStream;
import java.lang.invoke.LambdaMetafactory;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;public class LambdaPrinciple {public static void main(String[] args) {List<String> stringList = Arrays.asList("one", "two", "three");stringList.forEach((Consumer<String>)LambdaMetafactory.metafactory(null, null, null, (Ljava/lang/Object;)V, lambda$main$0(java.lang.String ), (Ljava/lang/String;)V)());}private static /* synthetic */ void lambda$main$0(String s) {System.out.println(s);}
}

3、分析Lambda实现逻辑

3.1、LambdaMetafactory.metafactory()方法

从下面的源码可以看出,Java是严格遵循的面向对象原则,这里返回的是一个对象,而不是一个函数体。

3.2、调用InnerClassLambdaMetafactory

3.3、InnerClassLambdaMetafactory.buildCallSite()构造调用点

3.4、调用InnerClassLambdaMetafactory.spinInnerClass()

4、使用Java命令打开dumps调试模式

Java命令java -Djdk.internal.lambda.dumpProxyClasses ClassName

打开调试模式

4.1、进入class文件包文件的目录

特别注意:比如class文件的包路径为 tech.flygo.lambda.demo4,则进入目录 tech的上一级目录

执行java命令:java -Djdk.internal.lambda.dumpProxyClasses tech.flygo.lambda.demo4.LambdaPrinciple

4.2、查看Lambda生成的匿名内部类

5、Java对动态语言的支持

使用javap查看class字节码:javap -p -v LambdaPrinciple

Java7之后增加了动态指令InvokeDynamic,Java支持动态语言

相关文章:

【响应式编程-03】Lambda表达式底层实现原理

一、简要描述 Lambda的底层实现原理Lambda表达式编译和运行过程 二、Lambda的底层实现原理 Lambda表达式的本质 函数式接口的匿名子类的匿名对象 反编译&#xff1a;cfr-0.145.jar 反编译&#xff1a;LambdaMetafactory.metafactory() 跟踪调试&#xff0c;转储Lambda类&#x…...

深入理解可变参数

1.C语言方式 目录 1.C语言方式 1.1.宏介绍 1.2.原理详解 1.3.宏的可变参数 1.4.案例分析 1.5.其他实例 2.C之std::initializer_list 2.1.简介 2.2.原理详解 2.3.案例分析 3.C之可变参数模版 3.1.简介 3.2.可变参数个数 3.3.递归包展开 3.4.逗号表达式展开 3.5…...

Centos7.9和Debian12部署Minio详细流程

一、安装minio Centos wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230227181045.0.0.x86_64.rpm -O minio.rpm sudo dnf install minio.rpmDebian wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230227181045.0…...

软件测试|教你如何使用UPDATE修改数据

简介 在SQL&#xff08;Structured Query Language&#xff09;中&#xff0c;UPDATE语句用于修改数据库表中的数据。通过UPDATE语句&#xff0c;我们可以更新表中的特定记录或多条记录&#xff0c;从而实现数据的修改和更新。本文将详细介绍SQL UPDATE语句的语法、用法以及一…...

新闻稿发布:媒体重要还是价格重要

在当今信息爆炸的数字时代&#xff0c;企业推广与品牌塑造不可或缺的一环就是新闻稿发布。新闻稿是一种通过媒体渠道传递企业信息、宣传品牌、事件或产品新闻的文本形式。发布新闻稿的过程旨在将企业的声音传递给更广泛的受众&#xff0c;借助媒体平台实现品牌故事的广泛传播。…...

prometheus grafana mysql监控配置使用

文章目录 前传bitnami/mysqld-exporter:0.15.1镜像出现了问题.my.cnf可以用这个"prom/mysqld-exporter:v0.15.0"镜像重要的事情mysql监控效果外传 前传 prometheus grafana的安装使用&#xff1a;https://nanxiang.blog.csdn.net/article/details/135384541 本文说…...

鸿蒙HarmonyOS-带笔锋手写板(三)

笔者用ArkTS 写了一个简单的带笔锋的手写板应用&#xff0c;并且可以将手写内容保存为图片。 一、效果图 手写效果如下&#xff08;在鸿蒙手机模拟器上运行&#xff0c;手写时反应可能会有点慢&#xff09; 二、实现方法 参考文章&#xff1a; 支持笔锋效果的手写签字控件_a…...

React 实现 Step组件

简介 本文将会实现步骤条组件功能。步骤条在以下几个方面改进。 1、将url与Step组件绑定&#xff0c;做到浏览器刷新&#xff0c;不会重定向到Step 1 2、通过LocalStorage 存储之前的Step&#xff0c;做到不丢失数据。 实现 Step.jsx (组件) import {useEffect, useState} fro…...

【OJ】单链表刷题

力扣刷题 1. 反转链表&#xff08;206&#xff09;1.1 题目描述1.2 题目分析1.2.1 头插法1.2.2 箭头反转 1.3 题目代码1.3.1 头插入1.3.2 箭头反转 2.合并两个有序链表&#xff08;21&#xff09;2.1 题目描述2.2 题目分析2.3 题目代码 1. 反转链表&#xff08;206&#xff09;…...

【UML建模】部署图(Deployment Diagram)

1.概述 部署图是一种结构图&#xff0c;用于描述软件系统在不同计算机硬件或设备上的部署和配置情况&#xff0c;以图形化的方式展示系统中组件、节点和连接之间的物理部署关系。 通过部署图&#xff0c;可以清晰地了解系统的物理结构和部署方式&#xff0c;包括系统组件和节…...

三、计算机理论-关系数据库-数据模型与数据视图;关系代数、关系演算及关系模型

数据模型 具体事物-抽象化-->概念模型-数据化-->数据模型 概念模型也称信息模型&#xff0c;在数据库设计阶段&#xff0c;由设计者按照用户的观点对数据和信息建模&#xff0c;实现对现实世界的概念抽象&#xff1b; 数据模型主要包括网状模型、层次模型、关系模型、面向…...

解读 $mash 通证 “Fair Launch” 规则(Staking 玩法解读篇)

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。...

【C语言】关于C11的一些新特性

相比于VC 6.0使用的ANSI C标准&#xff0c;VS2022使用的C11标准与上一代有很多不同&#xff0c;相比之前的 C 标准&#xff08;如 C89/C90 和 C99&#xff09;&#xff0c;引入了一些新的功能、特性和改进。以下是 C11 标准相对于之前版本的一些主要变化和新增内容&#xff1a;…...

牛的速记(c++题解)

题目描述 奶牛们误解了速记的含义。他们是这样理解的&#xff1a; 给出一个少于255个字母的小写字母串。 找到一个出现次数最多的字母&#xff0c;将该字母从字母串中统统删去&#xff0c;如果出现次数最多的字母不止一个&#xff0c;就删去在字母表中靠前的一个&#xff0c;即…...

使用ffmpeg+flv.js + websokect播放rtsp格式视频流

对于rtsp的视频流网上有很多种的解决方案&#xff0c;但是大的趋势还是利用ffmpeg的工具进行rtsp的视频解析进行一个推流&#xff0c;我最终选择bilibili开源的flv.js&#xff0c;代码十分的简单全部都在底层封装好了。实现的方式也比较容易理解&#xff0c;ffmpeg进行rtsp的视…...

OAI openair3代码结构整理

openair3代码框架结构 OAI&#xff08;OpenAirInterface&#xff09;是一个开源的5G网络软件平台&#xff0c;用于研究和开发5G网络技术。OpenAir3是OAI项目中的一个子项目&#xff0c;专注于5G核心网络的功能实现。 一、OpenAir3的代码主要包括以下几个部分&#xff1a; NAS…...

Kubernets(K8S)启动和运行 01-01 Kubernetes简介

Kubernets(K8S)启动和运行 01-01 Kubernetes简介 Kubernetes is an open source orchestrator for deploying containerized applications. It was originally developed by Google, inspired by a decade of experience deploying scalable, reliable systems in containers …...

PHP特性知识点扫盲 - 下篇

概述 在实际的生产环境中遇到了实际需要解决的问题&#xff0c;需要把服务部署的方式梳理出来&#xff0c;在同一个服务器中部署多个PHP环境&#xff0c;架构图如下&#xff1a; 架构方案 在工作实践中遇到的很多问题的普遍性都是相通的&#xff0c;公司运行的可新项目都是版…...

HarmonyOS应用开发之DevEco Studio安装与初次使用

1、DevEco Studio介绍 DevEco Studio是基于IntelliJ IDEA Community开源版本打造&#xff0c;面向华为终端全场景多设备的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;为开发者提供工程模板创建、开发、编译、调试、发布等E2E的HarmonyOS应用/服务的开发工具。…...

记录第一次在GitHub上面提交Issue

第一次在GitHub上面提交Issue&#xff0c;记录一下。 对着源码调了好久才发现&#xff0c;问题并不在程序而在模型&#xff08;虽然只是一个很小的问题&#xff0c;但是能够解决问题&#xff0c;并且做出了自己的一点小小贡献&#xff0c;还是很开心。嘻嘻&#xff0c;发博客记…...

【数据库设计和SQL基础语法】--用户权限管理--数据备份和恢复策略

一、引言 数据备份和恢复是数据库管理中至关重要的任务&#xff0c;对于确保数据安全性和业务连续性具有重大的意义。以下是一些关键的重要性方面&#xff1a; 防止数据丢失&#xff1a; 数据备份是防止因硬件故障、人为错误、恶意攻击或其他意外事件导致数据丢失的主要手段。…...

java数据结构与算法刷题-----LeetCode70. 爬楼梯

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…...

【Unity入门】UGUI之Slider(滑动条)

目录 一、什么是Slider&#xff1f;二、Slider属性与功能 一、什么是Slider&#xff1f; Slider控件允许用户可以通过鼠标来在预先确定的范围调节数值 我们可以在Hierarchy视图右键 -> UI ->Slider来创建滑动条 通过上图可以发现Unity内置的Slider主要有3部分&#x…...

MySQL中UNION和UNION ALL的区别有哪些?

在MySQL中如何想要对两个结果集进行合并操作&#xff0c;可以使用UNION和UNION ALL&#xff0c;如果只是想要去除掉重复的记录&#xff0c;属于UNION ALL 即可&#xff0c;但是如何想要除掉没有重复行数据&#xff0c;就要使用Union。本文详细向大家介绍MySQL中UNION和UNION AL…...

Android kotlin build.gradle.kts配置

1. 添加 maven 仓库 1. 1. settings配置 1. 1.1. settings.gradle repositories {maven {url https://maven.aliyun.com/repository/public/}mavenCentral() }1. 1.2. settings.gradle.kts repositories {maven {setUrl("https://maven.aliyun.com/repository/public/…...

css、js、vue常考部分面试题

css css盒子水平垂直居中方法 方法一&#xff1a;定位 .child{height: 100px;position: absolute;//父元素相对定位top:50%;left:50%;transform: translate(-50%,-50%); } 方法二&#xff1a;定位 .child{width: 100px;height: 100px;position: absolute;top:50%;left:50%…...

OpenAI ChatGPT-4开发笔记2024-03:Chat之Function Calling/Function/Tool/Tool_Choice

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…...

二叉搜索树与双向链表

解题思路一&#xff1a; /** public class TreeNode {int val 0;TreeNode left null;TreeNode right null;public TreeNode(int val) {this.val val;} } */ // 一定要用自己的理解真正弄出来才行&#xff0c;否则没有用&#xff01; // 再次提醒&#xff0c;计算机这种工科…...

uniapp中组件库的Checkbox 复选框 的丰富使用方法

目录 #平台差异说明 #基本使用 #自定义形状 #禁用checkbox #自定义形状 #自定义颜色 #横向排列形式 #横向两端排列形式 API #Checkbox Props #CheckboxGroup Props #CheckboxGroup Event 复选框组件一般用于需要多个选择的场景&#xff0c;该组件功能完整&#xff…...

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传&#xff0c;但是自己搭文件服务器会有很多运维的问题&#xff0c;比如磁盘满了要扩容…...

常德做网站建设的公司/百度seo排名优化技巧分享

敏捷认证上次我们看情况如何。 事情如何在滑雪胜地的一群软件开发人员之间汇聚&#xff1a;在该领域进行了实际实验&#xff0c;并取得了成功。 有一个沟通渠道可以传播这些想法。 现在有了共同的愿景和名字。 除非肯施瓦伯 &#xff08; Ken Schwaber &#xff09;具有精明的…...

wordpress 主题 带筛选/微信推广

转自 https://blog.csdn.net/asahinokawa/article/details/79415701 此部分&#xff08;到分割线为止&#xff09;来自出自AWeiLoveAndroid的博客https://www.jianshu.com/p/c70989bd5f29。初次看到是在鸿洋的微信公众号上&#xff0c;第一次见到这么全的清单。对作者的辛苦劳…...

遂宁网站建设/百度指数数据

2007-07-19 20:06tag:正则表达式 批量替换 editplus替换html文件中的非法“<",">”下面的方法将把html文件中类似于<str>的非html标记的尖括号替换掉。例如&#xff0c;将<str>用下面方法替换的结果是&#xff1a;<str>这里只提供了解决问题…...

贵州网站制作公司电话/安卓优化大师旧版

转自&#xff1a;http://www.cnblogs.com/bro-ma/p/3063942.html JQuery中的DOM操作主要对包括&#xff1a;建【新建】、增【添加】、删【删除】、改【修改】、查【查找】【像数据库操作】。 一、查--查找DOM节点 查找节点非常容易&#xff0c;使用选择器就能轻松完成各种查找工…...

工业设计代做网站/百度信息流账户搭建

一.单继承 一个子类对父类的某个方法重写后&#xff0c;可以用super重新调用父类的这个方法 格式 super().方法()例如 class Parent:def __init__(self):print("Parent") class Son1(Parent):pass class Son2(Parent):def __init__(self):print("Son2")…...

深圳电力建设公司/青岛百度seo排名

很久没有病过了&#xff0c;终于来到了。 周日晚上赶一篇文档&#xff0c;快一点才睡&#xff0c;就告诫自己&#xff0c;这样晚睡觉的日子已经过了很长时间了&#xff0c;长此以往会病的&#xff0c;于是决定从周一晚上开始改变一下。结果没有等到周一晚上就不行了。起因…...