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

长春网站提升排名书城网站建设项目定义

长春网站提升排名,书城网站建设项目定义,北仑建设局质监站网站,网站免费源码大全不用下载一、简要描述 Lambda的底层实现原理Lambda表达式编译和运行过程 二、Lambda的底层实现原理 Lambda表达式的本质 函数式接口的匿名子类的匿名对象 反编译:cfr-0.145.jar 反编译:LambdaMetafactory.metafactory() 跟踪调试,转储Lambda类&#x…

一、简要描述

  • 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支持动态语言

http://www.yingshimen.cn/news/534/

相关文章:

  • 建设快卡额度查询网站wordpress用户搜索次数插件
  • 建设公司网站模版图片转换链接生成器
  • 网站内部服务器错误wix做的网站
  • 棋牌游戏网站建设厦门网上房地产
  • 学院网站建设的特色dede网站转移
  • 怎么做电影引流网站东阳高端营销型网站建设品牌
  • 外汇做单在什么网站龙岗做网站公司icxun
  • 适合新手做的网站手机设计绘图软件app
  • 网站发布文章怎么才能让百度收录表白网址一键生成
  • 医院seo是什么一个网站做seo
  • html5网站建设企业wordpress怎么修改模板
  • 河南宏业建设管理有限公司网站中国网络安全官网
  • 湛江网站搜索引擎推广小程序游戏源码
  • 怎样修改网站关键词帮别人做网站需要什么能力
  • 网站搭建素材图书馆网站开发需求分析
  • 个人网站icp软件开发过程模型
  • 怎么做网站网站的代理建设三轮摩托车官网
  • 代做吧机械网站网站建设尚品
  • 国外网站空间php网站建设哪家好
  • 活泼风格的网站网站需求分析是在建站的什么阶段做的_为什么要做?
  • 服装织梦网站源码优秀设计案例
  • 在线做插画的网站wordpress阿里
  • 成都营销型网站公司电话wordpress lt
  • 个人网站icp备案号wordpress文章页排版
  • 做asp网站的实验收获学做花蛤的网站
  • 天津建站网建设行业网站平台的瓶颈
  • 张家港企业网站广州微网站建设机构
  • 万州微网站建设广州市南沙区建设和交通局网站
  • 台州做网站的电话百度网站外链发布平台
  • 如何管理wordpress网站模板关键词优化的策略