首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java字节码中翻译Lambda表达式

如何在Java字节码中翻译Lambda表达式
EN

Stack Overflow用户
提问于 2014-04-17 20:34:36
回答 1查看 5.1K关注 0票数 21

我正在尝试使用java中的lambda表达式创建一个示例,并且我正在使用offical JDK8。我的示例已成功运行。但是当我尝试检查编译器如何将lambda表达式转换为字节码时,这让我看到一些confusion.Following是我示例的代码:

代码语言:javascript
复制
public class LambdaTest {
    public Integer lambdaBinaryOpertor(BinaryOperator<Integer> binaryOperator) {
        return binaryOperator.apply(60, 72);
    }

    public static void main(String[] args) {
        LambdaTest test = new LambdaTest();
        BinaryOperator<Integer> binaryOperator = (a, b) -> a*b;
        System.out.println("Additon using Lambda BinaryOperator: "+test.lambdaBinaryOpertor(binaryOperator));
    }
}

在这篇Article中,他们讨论了编译器如何将lambda表达式翻译成字节码。根据本文将lambda表达式转换成static方法以及lambda表达式声明的位置,参考lambda static方法。文章中提供了以下示例:

代码语言:javascript
复制
//Source code
class A {
    public void foo() {
        List<String> list = ...
        list.forEach( s -> { System.out.println(s); } );
    }
} 

//After compile above code "translate code " 
class A {
    public void foo() {
        List<String> list = ...
        list.forEach( [lambda for lambda$1 as Block] );
    }

    static void lambda$1(String s) {
        System.out.println(s);
    }
}

我的示例运行良好,并给出了适当的结果。但是当我尝试运行javap命令来检查类的字节码时,字节码中没有静态的lambdas方法。

代码语言:javascript
复制
c:\>javap LambdaTest
Compiled from "LambdaTest.java"
public class LambdaTest {
public LambdaTest();
public java.lang.Integer lambdaBinaryOpertor(java.util.function.BinaryOperator <java.lang.Integer>);
public static void main(java.lang.String[]);
}

在泛型的情况下,桥方法是由编译器创建的,我们也将使用javap命令检查此方法,但在lambdas的情况下没有static方法。这篇文章发表于2012年,java8于2014年3月发布。所以我对lambda的跨国有一些疑问:

  1. 本文发布后,JDK8中是否有用于lambda的新实现,否则我会做一些错误的事情来检查lambda方法?
  2. 编译器如何处理lambda expression?
  3. How JVM调用lambda exression ?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-17 20:37:41

使用javap其他参数打印有关类的完整信息:javap -v -p -s -c

对于您的示例,lambda的源代码为:

代码语言:javascript
复制
private static java.lang.Integer lambda$main$0(java.lang.Integer, java.lang.Integer);
    descriptor: (Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
    flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0       
         1: invokevirtual #17                 // Method java/lang/Integer.intValue:()I
         4: aload_1       
         5: invokevirtual #17                 // Method java/lang/Integer.intValue:()I
         8: imul          
         9: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
        12: areturn       
      LineNumberTable:
        line 10: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0      13     0     a   Ljava/lang/Integer;
            0      13     1     b   Ljava/lang/Integer;
}
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23133243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档