java lambda 原理_Java8 lambda 底层实现原理

$ javap -c -v App

警告: 二进制文件App包含cn.victor.study.App

Classfile /Users/chutian/IdeaProjects/demos/target/classes/cn/victor/study/App.class

Last modified 2019-3-2; size 1353 bytes

MD5 checksum 7c3e6a94f67374296a68af43fa788f7b

Compiled from "App.java"

public class cn.victor.study.App

minor version: 0

major version: 52

flags: ACC_PUBLIC, ACC_SUPER

Constant pool:

#1 = Methodref #9.#31 // java/lang/Object."":()V

#2 = InterfaceMethodref #10.#32 // cn/victor/study/App$LambdaDemo.runLambda:()V

#3 = InvokeDynamic #0:#37 // #0:runLambda:()Lcn/victor/study/App$LambdaDemo;

#4 = Methodref #8.#38 // cn/victor/study/App.doSomething:(Lcn/victor/study/App$LambdaDemo;)V

#5 = Fieldref #39.#40 // java/lang/System.out:Ljava/io/PrintStream;

#6 = String #41 // hello world!

#7 = Methodref #42.#43 // java/io/PrintStream.println:(Ljava/lang/String;)V

#8 = Class #44 // cn/victor/study/App

#9 = Class #45 // java/lang/Object

#10 = Class #46 // cn/victor/study/App$LambdaDemo

#11 = Utf8 LambdaDemo

#12 = Utf8 InnerClasses

#13 = Utf8

#14 = Utf8 ()V

#15 = Utf8 Code

#16 = Utf8 LineNumberTable

#17 = Utf8 LocalVariableTable

#18 = Utf8 this

#19 = Utf8 Lcn/victor/study/App;

#20 = Utf8 doSomething

#21 = Utf8 (Lcn/victor/study/App$LambdaDemo;)V

#22 = Utf8 demo

#23 = Utf8 Lcn/victor/study/App$LambdaDemo;

#24 = Utf8 main

#25 = Utf8 ([Ljava/lang/String;)V

#26 = Utf8 args

#27 = Utf8 [Ljava/lang/String;

#28 = Utf8 lambda$main$0

#29 = Utf8 SourceFile

#30 = Utf8 App.java

#31 = NameAndType #13:#14 // "":()V

#32 = NameAndType #47:#14 // runLambda:()V

#33 = Utf8 BootstrapMethods

#34 = MethodHandle #6:#48 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#35 = MethodType #14 // ()V

#36 = MethodHandle #6:#49 // invokestatic cn/victor/study/App.lambda$main$0:()V

#37 = NameAndType #47:#50 // runLambda:()Lcn/victor/study/App$LambdaDemo;

#38 = NameAndType #20:#21 // doSomething:(Lcn/victor/study/App$LambdaDemo;)V

#39 = Class #51 // java/lang/System

#40 = NameAndType #52:#53 // out:Ljava/io/PrintStream;

#41 = Utf8 hello world!

#42 = Class #54 // java/io/PrintStream

#43 = NameAndType #55:#56 // println:(Ljava/lang/String;)V

#44 = Utf8 cn/victor/study/App

#45 = Utf8 java/lang/Object

#46 = Utf8 cn/victor/study/App$LambdaDemo

#47 = Utf8 runLambda

#48 = Methodref #57.#58 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#49 = Methodref #8.#59 // cn/victor/study/App.lambda$main$0:()V

#50 = Utf8 ()Lcn/victor/study/App$LambdaDemo;

#51 = Utf8 java/lang/System

#52 = Utf8 out

#53 = Utf8 Ljava/io/PrintStream;

#54 = Utf8 java/io/PrintStream

#55 = Utf8 println

#56 = Utf8 (Ljava/lang/String;)V

#57 = Class #60 // java/lang/invoke/LambdaMetafactory

#58 = NameAndType #61:#64 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#59 = NameAndType #28:#14 // lambda$main$0:()V

#60 = Utf8 java/lang/invoke/LambdaMetafactory

#61 = Utf8 metafactory

#62 = Class #66 // java/lang/invoke/MethodHandles$Lookup

#63 = Utf8 Lookup

#64 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

#65 = Class #67 // java/lang/invoke/MethodHandles

#66 = Utf8 java/lang/invoke/MethodHandles$Lookup

#67 = Utf8 java/lang/invoke/MethodHandles

{

public cn.victor.study.App();

descriptor: ()V

flags: ACC_PUBLIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokespecial #1 // Method java/lang/Object."":()V

4: return

LineNumberTable:

line 7: 0

LocalVariableTable:

Start Length Slot Name Signature

0 5 0 this Lcn/victor/study/App;

public static void doSomething(cn.victor.study.App$LambdaDemo);

descriptor: (Lcn/victor/study/App$LambdaDemo;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=1, locals=1, args_size=1

0: aload_0

1: invokeinterface #2, 1 // InterfaceMethod cn/victor/study/App$LambdaDemo.runLambda:()V

6: return

LineNumberTable:

line 14: 0

line 15: 6

LocalVariableTable:

Start Length Slot Name Signature

0 7 0 demo Lcn/victor/study/App$LambdaDemo;

public static void main(java.lang.String[]);

descriptor: ([Ljava/lang/String;)V

flags: ACC_PUBLIC, ACC_STATIC

Code:

stack=1, locals=1, args_size=1

0: invokedynamic #3, 0 // InvokeDynamic #0:runLambda:()Lcn/victor/study/App$LambdaDemo;

5: invokestatic #4 // Method doSomething:(Lcn/victor/study/App$LambdaDemo;)V

8: return

LineNumberTable:

line 18: 0

line 19: 8

LocalVariableTable:

Start Length Slot Name Signature

0 9 0 args [Ljava/lang/String;

private static void lambda$main$0();

descriptor: ()V

flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC

Code:

stack=2, locals=0, args_size=0

0: getstatic #5 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #6 // String hello world!

5: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: return

LineNumberTable:

line 18: 0

}

SourceFile: "App.java"

InnerClasses:

public static #11= #10 of #8; //LambdaDemo=class cn/victor/study/App$LambdaDemo of class cn/victor/study/App

public static final #63= #62 of #65; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles

BootstrapMethods:

0: #34 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;

Method arguments:

#35 ()V

#36 invokestatic cn/victor/study/App.lambda$main$0:()V

#35 ()V

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值