Created
June 13, 2017 19:41
-
-
Save mirogula/10b97adacf404a46df02b146ddd9be4c to your computer and use it in GitHub Desktop.
Anonymous class vs. Lambda - bytecode comparison
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Classfile /home/miro/workspaces/intelliJ-idea/lambdaBytecodeTest/out/production/lambdaBytecodeTest/Main$1.class | |
Last modified Jun 12, 2017; size 589 bytes | |
MD5 checksum 07f1763b58b33304ee08b938c03c93e6 | |
Compiled from "Main.java" | |
final class Main$1 implements java.lang.Runnable | |
minor version: 0 | |
major version: 52 | |
flags: ACC_FINAL, ACC_SUPER | |
Constant pool: | |
#1 = Methodref #6.#22 // java/lang/Object."<init>":()V | |
#2 = Fieldref #23.#24 // java/lang/System.out:Ljava/io/PrintStream; | |
#3 = String #25 // test | |
#4 = Methodref #26.#27 // java/io/PrintStream.println:(Ljava/lang/String;)V | |
#5 = Class #28 // Main$1 | |
#6 = Class #29 // java/lang/Object | |
#7 = Class #30 // java/lang/Runnable | |
#8 = Utf8 <init> | |
#9 = Utf8 ()V | |
#10 = Utf8 Code | |
#11 = Utf8 LineNumberTable | |
#12 = Utf8 LocalVariableTable | |
#13 = Utf8 this | |
#14 = Utf8 InnerClasses | |
#15 = Utf8 LMain$1; | |
#16 = Utf8 run | |
#17 = Utf8 SourceFile | |
#18 = Utf8 Main.java | |
#19 = Utf8 EnclosingMethod | |
#20 = Class #31 // Main | |
#21 = NameAndType #32:#33 // main:([Ljava/lang/String;)V | |
#22 = NameAndType #8:#9 // "<init>":()V | |
#23 = Class #34 // java/lang/System | |
#24 = NameAndType #35:#36 // out:Ljava/io/PrintStream; | |
#25 = Utf8 test | |
#26 = Class #37 // java/io/PrintStream | |
#27 = NameAndType #38:#39 // println:(Ljava/lang/String;)V | |
#28 = Utf8 Main$1 | |
#29 = Utf8 java/lang/Object | |
#30 = Utf8 java/lang/Runnable | |
#31 = Utf8 Main | |
#32 = Utf8 main | |
#33 = Utf8 ([Ljava/lang/String;)V | |
#34 = Utf8 java/lang/System | |
#35 = Utf8 out | |
#36 = Utf8 Ljava/io/PrintStream; | |
#37 = Utf8 java/io/PrintStream | |
#38 = Utf8 println | |
#39 = Utf8 (Ljava/lang/String;)V | |
{ | |
Main$1(); | |
descriptor: ()V | |
flags: | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokespecial #1 // Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 11: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this LMain$1; | |
public void run(); | |
descriptor: ()V | |
flags: ACC_PUBLIC | |
Code: | |
stack=2, locals=1, args_size=1 | |
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream; | |
3: ldc #3 // String test | |
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V | |
8: return | |
LineNumberTable: | |
line 14: 0 | |
line 15: 8 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 9 0 this LMain$1; | |
} | |
SourceFile: "Main.java" | |
EnclosingMethod: #20.#21 // Main.main | |
InnerClasses: | |
static #5; //class Main$1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Classfile /home/miro/workspaces/intelliJ-idea/lambdaBytecodeTest/out/production/lambdaBytecodeTest/Main.class | |
Last modified Jun 12, 2017; size 597 bytes | |
MD5 checksum dc623b7d755f161c2db5adcad086e7ae | |
Compiled from "Main.java" | |
public class Main | |
minor version: 0 | |
major version: 52 | |
flags: ACC_PUBLIC, ACC_SUPER | |
Constant pool: | |
#1 = Methodref #7.#26 // java/lang/Object."<init>":()V | |
#2 = InterfaceMethodref #27.#28 // java/lang/Runnable.run:()V | |
#3 = Class #29 // Main$1 | |
#4 = Methodref #3.#26 // Main$1."<init>":()V | |
#5 = Methodref #6.#30 // Main.testRun:(Ljava/lang/Runnable;)V | |
#6 = Class #31 // Main | |
#7 = Class #32 // java/lang/Object | |
#8 = Utf8 InnerClasses | |
#9 = Utf8 <init> | |
#10 = Utf8 ()V | |
#11 = Utf8 Code | |
#12 = Utf8 LineNumberTable | |
#13 = Utf8 LocalVariableTable | |
#14 = Utf8 this | |
#15 = Utf8 LMain; | |
#16 = Utf8 testRun | |
#17 = Utf8 (Ljava/lang/Runnable;)V | |
#18 = Utf8 r | |
#19 = Utf8 Ljava/lang/Runnable; | |
#20 = Utf8 main | |
#21 = Utf8 ([Ljava/lang/String;)V | |
#22 = Utf8 args | |
#23 = Utf8 [Ljava/lang/String; | |
#24 = Utf8 SourceFile | |
#25 = Utf8 Main.java | |
#26 = NameAndType #9:#10 // "<init>":()V | |
#27 = Class #33 // java/lang/Runnable | |
#28 = NameAndType #34:#10 // run:()V | |
#29 = Utf8 Main$1 | |
#30 = NameAndType #16:#17 // testRun:(Ljava/lang/Runnable;)V | |
#31 = Utf8 Main | |
#32 = Utf8 java/lang/Object | |
#33 = Utf8 java/lang/Runnable | |
#34 = Utf8 run | |
{ | |
public Main(); | |
descriptor: ()V | |
flags: ACC_PUBLIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokespecial #1 // Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 4: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this LMain; | |
public static void testRun(java.lang.Runnable); | |
descriptor: (Ljava/lang/Runnable;)V | |
flags: ACC_PUBLIC, ACC_STATIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokeinterface #2, 1 // InterfaceMethod java/lang/Runnable.run:()V | |
6: return | |
LineNumberTable: | |
line 7: 0 | |
line 8: 6 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 7 0 r Ljava/lang/Runnable; | |
public static void main(java.lang.String[]); | |
descriptor: ([Ljava/lang/String;)V | |
flags: ACC_PUBLIC, ACC_STATIC | |
Code: | |
stack=2, locals=1, args_size=1 | |
0: new #3 // class Main$1 | |
3: dup | |
4: invokespecial #4 // Method Main$1."<init>":()V | |
7: invokestatic #5 // Method testRun:(Ljava/lang/Runnable;)V | |
10: return | |
LineNumberTable: | |
line 11: 0 | |
line 17: 10 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 11 0 args [Ljava/lang/String; | |
} | |
SourceFile: "Main.java" | |
InnerClasses: | |
static #3; //class Main$1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//disassembe Main.class file: javap -l -p -s -sysinfo -constants -c -verbose Main.class | |
//disassemble Main$1.class file: javap -l -p -s -sysinfo -constants -c -verbose Main$1.class | |
public class Main { | |
public static void testRun(Runnable r) { | |
r.run(); | |
} | |
public static void main(String[] args) { | |
testRun(new Runnable() { | |
@Override | |
public void run() { | |
System.out.println("test"); | |
} | |
}); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Classfile /home/miro/workspaces/intelliJ-idea/lambdaBytecodeTest/out/production/lambdaBytecodeTest/Main.class | |
Last modified Jun 12, 2017; size 1234 bytes | |
MD5 checksum dcb763b2f25b1f9e8425f98fa13e8062 | |
Compiled from "Main.java" | |
public class Main | |
minor version: 0 | |
major version: 52 | |
flags: ACC_PUBLIC, ACC_SUPER | |
Constant pool: | |
#1 = Methodref #9.#28 // java/lang/Object."<init>":()V | |
#2 = InterfaceMethodref #29.#30 // java/lang/Runnable.run:()V | |
#3 = InvokeDynamic #0:#35 // #0:run:()Ljava/lang/Runnable; | |
#4 = Methodref #8.#36 // Main.testRun:(Ljava/lang/Runnable;)V | |
#5 = Fieldref #37.#38 // java/lang/System.out:Ljava/io/PrintStream; | |
#6 = String #39 // test | |
#7 = Methodref #40.#41 // java/io/PrintStream.println:(Ljava/lang/String;)V | |
#8 = Class #42 // Main | |
#9 = Class #43 // java/lang/Object | |
#10 = Utf8 <init> | |
#11 = Utf8 ()V | |
#12 = Utf8 Code | |
#13 = Utf8 LineNumberTable | |
#14 = Utf8 LocalVariableTable | |
#15 = Utf8 this | |
#16 = Utf8 LMain; | |
#17 = Utf8 testRun | |
#18 = Utf8 (Ljava/lang/Runnable;)V | |
#19 = Utf8 r | |
#20 = Utf8 Ljava/lang/Runnable; | |
#21 = Utf8 main | |
#22 = Utf8 ([Ljava/lang/String;)V | |
#23 = Utf8 args | |
#24 = Utf8 [Ljava/lang/String; | |
#25 = Utf8 lambda$main$0 | |
#26 = Utf8 SourceFile | |
#27 = Utf8 Main.java | |
#28 = NameAndType #10:#11 // "<init>":()V | |
#29 = Class #44 // java/lang/Runnable | |
#30 = NameAndType #45:#11 // run:()V | |
#31 = Utf8 BootstrapMethods | |
#32 = MethodHandle #6:#46 // 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; | |
#33 = MethodType #11 // ()V | |
#34 = MethodHandle #6:#47 // invokestatic Main.lambda$main$0:()V | |
#35 = NameAndType #45:#48 // run:()Ljava/lang/Runnable; | |
#36 = NameAndType #17:#18 // testRun:(Ljava/lang/Runnable;)V | |
#37 = Class #49 // java/lang/System | |
#38 = NameAndType #50:#51 // out:Ljava/io/PrintStream; | |
#39 = Utf8 test | |
#40 = Class #52 // java/io/PrintStream | |
#41 = NameAndType #53:#54 // println:(Ljava/lang/String;)V | |
#42 = Utf8 Main | |
#43 = Utf8 java/lang/Object | |
#44 = Utf8 java/lang/Runnable | |
#45 = Utf8 run | |
#46 = Methodref #55.#56 // 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; | |
#47 = Methodref #8.#57 // Main.lambda$main$0:()V | |
#48 = Utf8 ()Ljava/lang/Runnable; | |
#49 = Utf8 java/lang/System | |
#50 = Utf8 out | |
#51 = Utf8 Ljava/io/PrintStream; | |
#52 = Utf8 java/io/PrintStream | |
#53 = Utf8 println | |
#54 = Utf8 (Ljava/lang/String;)V | |
#55 = Class #58 // java/lang/invoke/LambdaMetafactory | |
#56 = NameAndType #59:#63 // 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; | |
#57 = NameAndType #25:#11 // lambda$main$0:()V | |
#58 = Utf8 java/lang/invoke/LambdaMetafactory | |
#59 = Utf8 metafactory | |
#60 = Class #65 // java/lang/invoke/MethodHandles$Lookup | |
#61 = Utf8 Lookup | |
#62 = Utf8 InnerClasses | |
#63 = 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; | |
#64 = Class #66 // java/lang/invoke/MethodHandles | |
#65 = Utf8 java/lang/invoke/MethodHandles$Lookup | |
#66 = Utf8 java/lang/invoke/MethodHandles | |
{ | |
public Main(); | |
descriptor: ()V | |
flags: ACC_PUBLIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokespecial #1 // Method java/lang/Object."<init>":()V | |
4: return | |
LineNumberTable: | |
line 4: 0 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 5 0 this LMain; | |
public static void testRun(java.lang.Runnable); | |
descriptor: (Ljava/lang/Runnable;)V | |
flags: ACC_PUBLIC, ACC_STATIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: aload_0 | |
1: invokeinterface #2, 1 // InterfaceMethod java/lang/Runnable.run:()V | |
6: return | |
LineNumberTable: | |
line 7: 0 | |
line 8: 6 | |
LocalVariableTable: | |
Start Length Slot Name Signature | |
0 7 0 r Ljava/lang/Runnable; | |
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:run:()Ljava/lang/Runnable; | |
5: invokestatic #4 // Method testRun:(Ljava/lang/Runnable;)V | |
8: return | |
LineNumberTable: | |
line 11: 0 | |
line 12: 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 test | |
5: invokevirtual #7 // Method java/io/PrintStream.println:(Ljava/lang/String;)V | |
8: return | |
LineNumberTable: | |
line 11: 0 | |
} | |
SourceFile: "Main.java" | |
InnerClasses: | |
public static final #61= #60 of #64; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles | |
BootstrapMethods: | |
0: #32 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: | |
#33 ()V | |
#34 invokestatic Main.lambda$main$0:()V | |
#33 ()V |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//disassemble Main.class file: javap -l -p -s -sysinfo -constants -c -verbose Main.class | |
public class Main { | |
public static void testRun(Runnable r) { | |
r.run(); | |
} | |
public static void main(String[] args) { | |
testRun(() -> { | |
System.out.println("test"); | |
}); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment