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 ...
随机推荐
- 简单讲解一下http2的多路复用
在 HTTP/1 中,每次请求都会建立一次HTTP连接,也就是我们常说的3次握手4次挥手,这个过程在一次请求过程中占用了相当长的时间,即使开启了 Keep-Alive ,解决了多次连接的问题,但是依然 ...
- scrapy 基础组件专题(六):自定义命令
写好自己的爬虫项目之后,可以自己定制爬虫运行的命令. 一.单爬虫 在项目的根目录下新建一个py文件,如命名为start.py,写入如下代码: from scrapy.cmdline import ex ...
- linux专题(五):常用的基本命令(三)文件内容查看
http://dwz.date/UDf 概述 Linux系统中使用以下命令来查看文件的内容: cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! n ...
- Alexnet网络结构
最近试一下kaggle的文字检测的题目,目前方向有两个ssd和cptn.直接看看不太懂,看到Alexnet是基础,今天手写一下网络,记录一下啊. 先理解下Alexnet中使用的原件和作用: 激活函数使 ...
- 【Nginx】如何封禁IP和IP段?看完这篇我会了!!
写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[ ...
- Hangfire实战(一)------Hangfire+SQL Server实现简单的任务调度
Hangfire:一个开源的任务调度框架 开发环境:VS2017,SQL Server 2012,.NET Framework 4.5 项目类型:控制台应用程序 1.在vs的程序包控制台中为项目添加H ...
- C# 字段初始值无法引用非静态字段、方法或属性( 类内部变量初始化)
问题:字段初始值设定项无法引用非静态字段.方法或属性的问题 在类中 变量赋值其他变量报错? public class TestClass{ public TestClass() { } pu ...
- sql与SQL CODE和SQL State相关报错
操作数据库过程中,遇到许多问题,很多都与SQL CODE和SQL State相关,现在把一个完整的SQLCODE和SQLState错误信息和相关解释作以下说明,一来可以自己参考,对DB2错误自行找出原 ...
- swagger -- 前后端分离的API接口
文章目录 一.背景 二.swagger介绍 三.在maven+springboot项目中使用swagger 四.swagger在项目中的好处 五.美化界面 参考链接:5分钟学会swagger配置 参考 ...
- OpenLDAP 2.4.44 安装部署避坑指南
写在前面: 有关openLDAP的部署文档在网上随意能找到很多,但是最近用到才发现网上的教程多数是旧版的用法,例如"/etc/openldap/slapd.conf “早已弃用,更有甚者直接 ...