zoukankan      html  css  js  c++  java
  • lambda表达式在底层的执行过程

    一、执行过程

      lambda在编译时,会先将处理逻辑生成一个私有的静态方法。并且会生成一个final类,实现lambda表达式所绑定的接口,并通过调用已生成的私有静态方法,来实现抽象方法。

    二、反编译查看源码

    1、先创建一个用来反编译的类

    public class App{
        public static void main(String[] args){
            IInterface inter = (msg) -> System.out.println(msg);
            inter.apple("hello");
        }
        
        
        interface IInterface{
            void apple(String msg);
        }
    }

    2、在cmd里编译它

    javac App.java

    生成如下文件:

     第一个是接口的class文件,第二个是App.java的class文件

    3、反编译App.class

    javap -p App.class

    结果:

    Compiled from "App.java"
    public class App {
      public App();//空的构造方法
      public static void main(java.lang.String[]);//main方法
      private static void lambda$main$0(java.lang.String);//处理逻辑【(msg) -> System.out.println(msg)】,生成的私有静态方法) }

    4、输出内部隐藏的源代码

    java -Djdk.internal.lambda.dumpProxyClasses App

    结果:

     多出一个,App$$Lambda$1.class文件。

    反编译该文件:

    javap -p App$$Lambda$1.class

    结果:

    final class App$$Lambda$1 implements App$IInterface {
      private App$$Lambda$1();
      public void apple(java.lang.String);
    }

    该类实现了函数式接口,并实现了它的抽象方法,该实现就是:调用,private static void lambda$main$0(java.lang.String)方法。

    总结:

    1、lambda表达式,将处理逻辑生成静态私有方法。

    2、生成一个final类实现函数式接口,调用静态私有方法来实现抽象方法。

    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    读財报:交易额增长111%的京东,为毛还是亏?
    HDU 1548 A strange lift 搜索
    linux两台server远程copy文件
    Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离具体解释
    js事件防止冒泡
    LeetCode Rotate Array
    ARM架构授权和IP核授权有什么不一样啊?
    Linux系统结构 详解
    mount -o
    ARM开发板系统移植-----u-boot的编译
  • 原文地址:https://www.cnblogs.com/whalesea/p/12908155.html
Copyright © 2011-2022 走看看