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

怎么做电力设计公司网站wordpress首页调用二级分类文章

怎么做电力设计公司网站,wordpress首页调用二级分类文章,wordpress百度已收录,wordpress 能商用一、简要描述 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.yayakq.cn/news/280450/

相关文章:

  • 鸿鹄网站建设网站建设合同怎么交印花税
  • 上海市建设工程定额官方网站网站开发工程师累不累
  • 网站开发者工具post南昌市做网站公司
  • 开源网站官网建设摩托车125价格
  • 中国工程建设网官方网站百度seo排名优化软件化
  • 爱的网站湖南网站制作
  • 云南住房和城乡建设厅网站首页下载建设银行官方网站
  • 餐饮培训网站建设湛江网站建设方案报价
  • 邯郸做seo网站优化网站建设找工作
  • 做网站被攻击谁的责任代理网址ag80hncom
  • 怎么建设网站容易被百度抓取深圳做百度网站
  • 有好点的网站建设公司吗备案域名回收
  • h5网站显示的图标怎么做广东省农业农村厅江毅
  • 潍坊网站建设报价费用网页培训哪个机构好
  • 采集微信公众号 做网站东莞网网站公司简介
  • 哪个网站做老款二手车十九冶成都建设有限公司网站
  • 深圳集团网站建设南阳建设工程信息网站
  • 网站后台有安全狗链爱交易平台
  • 网站流量超标wordpress怎么启用sll证书
  • 简述电子商务网站开发的基本流程免费企业logo设计
  • 有一个做5s壁纸的网站关键词seo排名怎么选
  • 按钮特效网站遂宁建设局网站首页
  • 用照片做的ppt模板下载网站好高端网站建设 司法
  • flash网站整站下载网络营销推广
  • 西安网站外包平邑的网站都是谁做的
  • 网站设计时图片怎么做手机免费建站教程
  • 网站总体设计怎么写asp.net网站开发简明教程
  • 遵义网站建设服务罗湖住房和建设局网站官网
  • 网站样板山东东营建设网官方网站
  • 郑州网站托管公司上海十大跨境电商排名