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

    就算这个世道烂成一堆粪坑,那也不是你吃屎的理由
  • 相关阅读:
    linux CentOS6.5 yum安装mysql 5.6
    CentOS6.5安装指定的PHP版本(php5.5)(转)
    openssl加密文件过程
    我的投资
    我的unity3d之路_01_序言
    我为什么想转Unity3d
    TensorFlow_01_真正从零开始,TensorFlow详细安装入门图文教程!
    为什么掌握 UML 建模是成为编程高手的一条捷径?
    《UML面向对象建模与设计》一书
    OOAD基本概念
  • 原文地址:https://www.cnblogs.com/whalesea/p/12908155.html
Copyright © 2011-2022 走看看