Lambda表达式运行原理
JDK8引入了Lambda表达式以后,对我们写代码提供了很大的便利,那么Lambda表达式是如何运用简单表示来达到运行效果的呢?今天,我们通过一个例子来学习下Lambda表达式的底层运行原理!
一、创建测试样例
首先:我们创建一个测试类App.java,在它内部新建一个函数式接口Lam.java,只有一个抽象方法print(),作用是将传入的消息加工后再输出。
然后:我们在测试类App.java中进行lambda表达式的创建测试。
代码如下:
public class App {
public static void main(String[] args) {
Lam lam = (msg) -> "log:" + msg;
String result = lam.print("Test");
System.out.println(result);
}
}
interface Lam {
String print(String msg);
}
二、利用Java命令编译分析
首先,我们进行javac命令的编译,会生成两个class文件:
javac App.java
然后,我们通过javap -p命令打开Lam.class:
javap -p Lam.class
从图中我们可以看到,因为Lam.class是App.class的内部类,所以提示我们它是App.java编译过来的,并且其内部只有一个abstract方法print()。
接下来,我们再打开App.class:
javap -p App.class
App.class中一共有三个方法,一个默认构造方法,一个main方法,还多了一个我们没有定义过的方法:lambda$main$0(String),很明显,这个方法就是lambda表达式内逻辑操作方法,它是一个static的方法,入参就是我们传入的msg类型String。
那么,这个lambda$main$0(String)方法是怎么被调用的呢?我们通过对java命令指定选项查看底层详细的编译过程:
java -Djdk.internal.lambda.dumpProxyClasses App
我们能够看到多出来一个App$$Lambda$1.class文件,打开文件:
javap -p App$$Lambda$1.class
我们看到,这个类是一个实现Lam接口的final类,它内部实现了print()方法。
我们再通过javap -c查看一下它内部详细信息:
javap -c App$$Lambda$1.class
由此我们可以看出,App$$Lambda$1.class的print()方法执行了App.lambda$main$0(),因此,我们就可以得出结论:
- Java在编译时,首先,在App内将Lambda表达式抽取出来作为一个static方法lambda$main$0(String);
- 然后,对Lam.class做了默认实现App$$Lambda$1.class,并在内部print()方法中调用了App内的static方法:lambda$main$0();
- 接下来,执行App的main()方法时,就会对lambda表达式利用实现类的print()方法运行;
- 最后,将结果返回,并打印。
这就是Lambda表达式的底层运行逻辑。
三、文末
以上,就是我们通过一个实例,运用Java命令,来理解Lambda表达式的底层运行原理的全部内容,希望对你有所帮助!
O(∩_∩)O
Lambda表达式运行原理的更多相关文章
- 深入探究JVM之方法调用及Lambda表达式实现原理
@ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...
- Java基础进阶:内部类lambda重点摘要,详细讲解成员内部类,局部内部类,匿名内部类,Lambda表达式,Lambda表达式和匿名内部类的区别,附重难点,代码实现源码,课堂笔记,课后扩展及答案
内部类lambda重点摘要 内部类特点: 内部类可以直接访问外部类,包括私有 外部类访问内部类必须创建对象 创建内部对象格式: 外部类.内部类 对象名=new外部类().new内部类(); 静态内部类 ...
- 17.继承 and18.接口和多态 内部类 匿名内部类,Lambda表达式
1. 继承 1.1 继承的实现(掌握) 继承的概念 继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法 实现继承的格式 继承通过extends实现 ...
- 作为有经验的程序员如果不懂Lambda表达式就说不过去了吧,建议收藏!!!
最近刚好有空给大家整理下JDK8的特性,这个在实际开发中的作用也是越来越重了,本文重点讲解下Lambda表达式 Lambda表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 ...
- JDK中Lambda表达式的序列化与SerializedLambda的巧妙使用
前提 笔者在下班空余时间想以Javassist为核心基于JDBC写一套摒弃反射调用的轻量级的ORM框架,过程中有研读mybatis.tk-mapper.mybatis-plus和spring-boot ...
- Java Lambda表达式初探
Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...
- Lambda表达式之Python
一.lambda函数 1.lambda函数基础: lambda函数也叫匿名函数,即,函数没有具体的名称,而用def创建的方法是有名称的.如下: """命名的foo函数&q ...
- python之lambda表达式
lambda函数小结 1.lambda表达式: 以前看人家写一个长式子就能干一件我写一个函数干的事情觉得好帅,现在通过学习知道了lambda表达式其原理就是一个函数,而且是一个只能处理简单功能的函数. ...
- Python基础-Python的三元运算符和lambda表达式
1. Python的三元表达式: 现在大部分高级语言都支持 “?”这个三元运算符,它对应的表达式如下:condition ? value if true:value if else 但是 Python ...
随机推荐
- Mysql查询语句执行过程
Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注 ...
- PE文件格式详解(一)
PE文件格式介绍(一) 0x00 前言 PE文件是portable File Format(可移植文件)的简写,我们比较熟悉的DLL和exe文件都是PE文件.了解PE文件格式有助于加深对操作系统的理解 ...
- AHP(使用于某项目设备重要度评估测试)
用层次法和蒙特卡洛模型计算权重系数,然后建立判断矩阵进行随机一致性检验,最后求出重要度指数. string calculateStr = "1,2,3,2,1,|1,2,3,2,1,|1,2 ...
- 虚拟机 - 桥接模式下,虚拟网卡没有 ip
背景 Linux 虚拟机,用桥接模式,敲 ifconfig命令,ens33 没有 ip 即没有红色圈住那部分 解决方案 修改配置文件 vim /etc/sysconfig/network-script ...
- C++快速读写
1.主函数的最前面加入这个 std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); 2.这是一个读入数字的快读 inline int read() ...
- Linux超强截图工具flameshot
Pop!_OS自带的截屏快捷键如下 但讲道理这个是真的不好用 所以我们借助第三方的截图工具,这里推荐flameshot(火焰截图) 在终端键入以下命令即可安装 sudo apt update sudo ...
- 数据可视化实例(八): 边缘直方图(matplotlib,pandas)
https://datawhalechina.github.io/pms50/#/chapter6/chapter6 边缘直方图 (Marginal Histogram) 边缘直方图具有沿 X 和 Y ...
- Ethical Hacking - Web Penetration Testing(13)
OWASP ZAP(ZED ATTACK PROXY) Automatically find vulnerabilities in web applications. Free and easy to ...
- Python Ethical Hacking - Malware Analysis(4)
DOWNLOAD_FILE Download files on a system. Once packaged properly will work on all operating systems. ...
- 为Dark模拟做出的一些微小的贡献
这几周经过liners大佬的指导,发现自己的代码实现能力确实太过于垃圾,所以根据他的指示,我应该去多多练习一下Dark模拟,但是最近刚刚入手Dark模拟的我感到非常的吃力,所以本人今天写博客一篇来讲述 ...