Skip to content

Instantly share code, notes, and snippets.

@mirogula
Created June 13, 2017 19:41
Show Gist options
  • Save mirogula/10b97adacf404a46df02b146ddd9be4c to your computer and use it in GitHub Desktop.
Save mirogula/10b97adacf404a46df02b146ddd9be4c to your computer and use it in GitHub Desktop.
Anonymous class vs. Lambda - bytecode comparison
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
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
//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");
}
});
}
}
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
//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