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类实现函数式接口,调用静态私有方法来实现抽象方法。

    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    Adobe Photoshop cs6 破解方法
    vs2008试用90天破解方法
    Install win8_pro using UltraISO
    面试题-100盏灯问题
    PHP 博客文集 1 Veda原型 成功,唯有积累,没有奇迹
    php 框架
    php 语法2
    干货 连接
    试题 极客学院
    地图
  • 原文地址:https://www.cnblogs.com/whalesea/p/12908155.html
Copyright © 2011-2022 走看看