推广

Java Lambda 表达式源码分析

iseeyu2年前 (2024-02-22)推广133

详情见 Class LambdaMetafactory 官方文档,java.lang.invoke.LambdaMetafactory#metafactory 的实现。

public static CallSite metafactory(MethodHandles.Lookup caller,
                                    String invokedName,
                                    MethodType invokedType,
                                    MethodType samMethodType,
                                    MethodHandle implMethod,
                                    MethodType instantiatedMethodType)
        throws LambdaConversionException {
    AbstractValidatingLambdaMetafactory mf;
    mf = new InnerClassLambdaMetafactory(caller, invokedType,
                                            invokedName, samMethodType,
                                            implMethod, instantiatedMethodType,
                                            false, EMPTY_CLASS_ARRAY, EMPTY_MT_ARRAY);
    mf.validateMetafactoryArgs();
    return mf.buildCallSite();
}

其主要的概念有如下几个:

  • invokedynamic 字节码指令:运行时 JVM 第一次到某个地方的这个指令的时候会进行 linkage,会调用用户指定的 Bootstrap Method 来决定要执行什么方法,之后便不需要这个步骤。
  • Bootstrap Method: 用户可以自己编写的方法,最终需要返回一个 CallSite 对象。
  • CallSite: 保存 MethodHandle 的容器,里面有一个 target MethodHandle。
    MethodHandle: 真正要执行的方法的指针。

测试一下 Lambda 函数生成的字节码,为了方便起见,java 代码改成如下:

public class LambdaMain {

    public static void main(String[] args) {
        new Thread(() -> System.out.println("1")).start();
    }
}

先编译成 class 文件,之后再反汇编 javap -c -p LambdaMain 看下输出:

Compiled from "LambdaMain.java"
public class test.jdk.LambdaMain {
  public test.jdk.LambdaMain();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/lang/Thread
       3: dup
       4: invokedynamic #3,  0              // InvokeDynamic #0:run:()Ljava/lang/Runnable;
       9: invokespecial #4                  // Method java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
      12: invokevirtual #5                  // Method java/lang/Thread.start:()V
      15: return

  private static void lambda$main$0();
    Code:
       0: getstatic     #6                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #7                  // String 1
       5: invokevirtual #8                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

可以看到 Thread 里的 Runnable 实现是通过 invokedynamic 调用的。详细情况 JVM 虚拟机规范,等有时间再补充吧~~~

总结

  • Lambda 表达式在 Java 中最终编译成私有的静态函数,JDK 最终使用 invokedynamic 字节码指令调用。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/56227.html

相关文章

常用30种实用的网站推广方法(网站如何推广)

常用30种实用的网站推广方法(网站如何推广)

网站推广方法 1、SNS网站软文推广法:现在SNS类型的网站非常流行,去SNS网站主要是去几个有人气的SNS网站有针对性的加几百上千个用户。然后选择合适的软文并合理的附带上网站链接,发表到自己的日志里。再让自己的一些好友分享,这样就让很多人都关注到你的文章,关注到了你的网站。 2、SN...

独家解读:河南公布186名新闻发言人109名为“新秀”

独家解读:河南公布186名新闻发言人109名为“新秀”

编者按:近日,河南省委宣传部、省政府新闻办公室公开发布了河南省2022年新闻发言人名单,169个机构的186名发言人“集中亮相”。人民网河南频道为您独家解读。规格提升队伍壮大两名副省级领导出任发言人尚属首次河南省于2003年建立新闻发言人制度,于2016年开始陆续对外公布各...

如何系统的学习SEM优化知识。

如何系统的学习SEM优化知识。

怎样学习SEM优化,是每个进入领域的新人想要了解的知识。虽然说现在有很多的线上视频或SEM学习资料供大家去提升自己。但是如果掌握不到一系列化的流程,而只是片段化的截取相关知识,那么终究是很难掌握到SEM搜索引擎营销的精华所在。 SEM搜索引擎营销的逻辑给理清楚,让新人朋友们可以有序的学习...

怎么做百度知道等问答推广外链?以及注意事项。

怎么做百度知道等问答推广外链?以及注意事项。

大家都知道,问答类的网站权重很高,SEO优化工作需要做,高质量的外链对于引入网站流量和提高网页权重有益。做外链的途径有很多,通过就是方法之一。就国内目前来说,百度知道、搜狗问答、新浪爱问、天涯问答等都是问答推广平台,因为百度知道的市场占有率最高,所以是做问答推广外链的最佳平台。那怎么做百度知道等问答...

怎么推广理财产品(这里有套IP解决方案)

怎么推广理财产品(这里有套IP解决方案)

在这个信息爆炸的时代,我们每天都在使用互联网。我们会使用各种各样的网络工具和应用来推广自己。我们需要有一种工具可以让你的产品更好地得到推广。下面是一些简单的推广方法,来看看都有哪些? 1.直接给客户发链接 这里有一个建议:你可以直接给客户发链接,如果他们想要购买,你可以直接与他们联系。...

小编分享网站推广平台需要如何做呢(网站推广哪个平台最好)

小编分享网站推广平台需要如何做呢(网站推广哪个平台最好)

现在是互联网时代,很多宣传和推广也转移到了网络上面,很多企业和团队通过网站来做产品展示的平台。不过平台也需要宣传,具体呢? 推广网站平台需要:首先,要了解自己的网站平台主要的目标客户群体是哪些人,他们具备什么样的特点和需求。作为推广人员,不管是推广平台还是推广产品都需要了解市场和客户。...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片