Skip to content

Instantly share code, notes, and snippets.

@YujiSoftware
Last active December 14, 2021 16:54
Show Gist options
  • Save YujiSoftware/0caa8b421fd5598289bbdc3ad6dbf6a8 to your computer and use it in GitHub Desktop.
Save YujiSoftware/0caa8b421fd5598289bbdc3ad6dbf6a8 to your computer and use it in GitHub Desktop.
ラムダのコンパイル結果を5分で説明するよ
Classfile /C:/Users/YujiSoftware/Desktop/java/Main$$Lambda$1.class
Last modified 2021/12/15; size 355 bytes
SHA-256 checksum 879c6dcc5fd72e49cae77892678512717f1fa1df22c94af9de737f4d56be9b40
final class Main$$Lambda$1 implements java.util.Comparator
minor version: 0
major version: 59
flags: (0x1030) ACC_FINAL, ACC_SUPER, ACC_SYNTHETIC
this_class: #2 // Main$$Lambda$1
super_class: #4 // java/lang/Object
interfaces: 1, fields: 0, methods: 2, attributes: 0
Constant pool:
#1 = Utf8 Main$$Lambda$1
#2 = Class #1 // Main$$Lambda$1
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 java/util/Comparator
#6 = Class #5 // java/util/Comparator
#7 = Utf8 <init>
#8 = Utf8 ()V
#9 = NameAndType #7:#8 // "<init>":()V
#10 = Methodref #4.#9 // java/lang/Object."<init>":()V
#11 = Utf8 compare
#12 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)I
#13 = Utf8 java/lang/String
#14 = Class #13 // java/lang/String
#15 = Utf8 Main
#16 = Class #15 // Main
#17 = Utf8 lambda$sortByLength$0
#18 = Utf8 (Ljava/lang/String;Ljava/lang/String;)I
#19 = NameAndType #17:#18 // lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#20 = Methodref #16.#19 // Main.lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#21 = Utf8 Code
{
private Main$$Lambda$1();
descriptor: ()V
flags: (0x0002) ACC_PRIVATE
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: return
public int compare(java.lang.Object, java.lang.Object);
descriptor: (Ljava/lang/Object;Ljava/lang/Object;)I
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: aload_1
1: checkcast #14 // class java/lang/String
4: aload_2
5: checkcast #14 // class java/lang/String
8: invokestatic #20 // Method Main.lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
11: ireturn
}
Classfile /C:/Users/YujiSoftware/Desktop/java/Main$1.class
Last modified 2021/12/15; size 683 bytes
SHA-256 checksum 38c38132cf13cb67a30a67c5f9659700cd97ed85980f83034cff9b3c4b1d168c
Compiled from "Main.java"
class Main$1 extends java.lang.Object implements java.util.Comparator<java.lang.String>
minor version: 0
major version: 61
flags: (0x0020) ACC_SUPER
this_class: #14 // Main$1
super_class: #2 // java/lang/Object
interfaces: 1, fields: 0, methods: 3, attributes: 5
Constant pool:
#1 = Methodref #2.#3 // java/lang/Object."<init>":()V
#2 = Class #4 // java/lang/Object
#3 = NameAndType #5:#6 // "<init>":()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Methodref #8.#9 // java/lang/String.length:()I
#8 = Class #10 // java/lang/String
#9 = NameAndType #11:#12 // length:()I
#10 = Utf8 java/lang/String
#11 = Utf8 length
#12 = Utf8 ()I
#13 = Methodref #14.#15 // Main$1.compare:(Ljava/lang/String;Ljava/lang/String;)I
#14 = Class #16 // Main$1
#15 = NameAndType #17:#18 // compare:(Ljava/lang/String;Ljava/lang/String;)I
#16 = Utf8 Main$1
#17 = Utf8 compare
#18 = Utf8 (Ljava/lang/String;Ljava/lang/String;)I
#19 = Class #20 // java/util/Comparator
#20 = Utf8 java/util/Comparator
#21 = Utf8 Code
#22 = Utf8 LineNumberTable
#23 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)I
#24 = Utf8 Signature
#25 = Utf8 Ljava/lang/Object;Ljava/util/Comparator<Ljava/lang/String;>;
#26 = Utf8 SourceFile
#27 = Utf8 Main.java
#28 = Utf8 EnclosingMethod
#29 = Class #30 // Main
#30 = Utf8 Main
#31 = NameAndType #32:#33 // sortByLengthAnonymas:(Ljava/util/List;)V
#32 = Utf8 sortByLengthAnonymas
#33 = Utf8 (Ljava/util/List;)V
#34 = Utf8 NestHost
#35 = Utf8 InnerClasses
{
Main$1();
descriptor: ()V
flags: (0x0000)
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 17: 0
public int compare(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)I
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: aload_1
1: invokevirtual #7 // Method java/lang/String.length:()I
4: aload_2
5: invokevirtual #7 // Method java/lang/String.length:()I
8: isub
9: ireturn
LineNumberTable:
line 20: 0
public int compare(java.lang.Object, java.lang.Object);
descriptor: (Ljava/lang/Object;Ljava/lang/Object;)I
flags: (0x1041) ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
Code:
stack=3, locals=3, args_size=3
0: aload_0
1: aload_1
2: checkcast #8 // class java/lang/String
5: aload_2
6: checkcast #8 // class java/lang/String
9: invokevirtual #13 // Method compare:(Ljava/lang/String;Ljava/lang/String;)I
12: ireturn
LineNumberTable:
line 17: 0
}
Signature: #25 // Ljava/lang/Object;Ljava/util/Comparator<Ljava/lang/String;>;
SourceFile: "Main.java"
EnclosingMethod: #29.#31 // Main.sortByLengthAnonymas
NestHost: class Main
InnerClasses:
#14; // class Main$1
Classfile /C:/Users/YujiSoftware/Desktop/java/Main.class
Last modified 2021/12/15; size 1429 bytes
SHA-256 checksum 1df914f2203a480d769256ccb29d60cf4cdffc0e677af05faa98ee874368cf8b
Compiled from "Main.java"
public class Main
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
this_class: #14 // Main
super_class: #2 // java/lang/Object
interfaces: 0, fields: 0, methods: 5, attributes: 4
Constant pool:
#1 = Methodref #2.#3 // java/lang/Object."<init>":()V
#2 = Class #4 // java/lang/Object
#3 = NameAndType #5:#6 // "<init>":()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Methodref #8.#9 // java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
#8 = Class #10 // java/util/Arrays
#9 = NameAndType #11:#12 // asList:([Ljava/lang/Object;)Ljava/util/List;
#10 = Utf8 java/util/Arrays
#11 = Utf8 asList
#12 = Utf8 ([Ljava/lang/Object;)Ljava/util/List;
#13 = Methodref #14.#15 // Main.sortByLength:(Ljava/util/List;)V
#14 = Class #16 // Main
#15 = NameAndType #17:#18 // sortByLength:(Ljava/util/List;)V
#16 = Utf8 Main
#17 = Utf8 sortByLength
#18 = Utf8 (Ljava/util/List;)V
#19 = InvokeDynamic #0:#20 // #0:compare:()Ljava/util/Comparator;
#20 = NameAndType #21:#22 // compare:()Ljava/util/Comparator;
#21 = Utf8 compare
#22 = Utf8 ()Ljava/util/Comparator;
#23 = Methodref #24.#25 // java/util/Collections.sort:(Ljava/util/List;Ljava/util/Comparator;)V
#24 = Class #26 // java/util/Collections
#25 = NameAndType #27:#28 // sort:(Ljava/util/List;Ljava/util/Comparator;)V
#26 = Utf8 java/util/Collections
#27 = Utf8 sort
#28 = Utf8 (Ljava/util/List;Ljava/util/Comparator;)V
#29 = Class #30 // Main$1
#30 = Utf8 Main$1
#31 = Methodref #29.#3 // Main$1."<init>":()V
#32 = Methodref #33.#34 // java/lang/String.length:()I
#33 = Class #35 // java/lang/String
#34 = NameAndType #36:#37 // length:()I
#35 = Utf8 java/lang/String
#36 = Utf8 length
#37 = Utf8 ()I
#38 = Utf8 Code
#39 = Utf8 LineNumberTable
#40 = Utf8 main
#41 = Utf8 ([Ljava/lang/String;)V
#42 = Utf8 Signature
#43 = Utf8 (Ljava/util/List<Ljava/lang/String;>;)V
#44 = Utf8 sortByLengthAnonymas
#45 = Utf8 lambda$sortByLength$0
#46 = Utf8 (Ljava/lang/String;Ljava/lang/String;)I
#47 = Utf8 SourceFile
#48 = Utf8 Main.java
#49 = Utf8 NestMembers
#50 = Utf8 BootstrapMethods
#51 = MethodHandle 6:#52 // REF_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;
#52 = Methodref #53.#54 // 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;
#53 = Class #55 // java/lang/invoke/LambdaMetafactory
#54 = NameAndType #56:#57 // 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;
#55 = Utf8 java/lang/invoke/LambdaMetafactory
#56 = Utf8 metafactory
#57 = 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;
#58 = MethodType #59 // (Ljava/lang/Object;Ljava/lang/Object;)I
#59 = Utf8 (Ljava/lang/Object;Ljava/lang/Object;)I
#60 = MethodHandle 6:#61 // REF_invokeStatic Main.lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#61 = Methodref #14.#62 // Main.lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#62 = NameAndType #45:#46 // lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#63 = MethodType #46 // (Ljava/lang/String;Ljava/lang/String;)I
#64 = Utf8 InnerClasses
#65 = Class #66 // java/lang/invoke/MethodHandles$Lookup
#66 = Utf8 java/lang/invoke/MethodHandles$Lookup
#67 = Class #68 // java/lang/invoke/MethodHandles
#68 = Utf8 java/lang/invoke/MethodHandles
#69 = Utf8 Lookup
{
public Main();
descriptor: ()V
flags: (0x0001) 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 7: 0
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokestatic #7 // Method java/util/Arrays.asList:([Ljava/lang/Object;)Ljava/util/List;
4: invokestatic #13 // Method sortByLength:(Ljava/util/List;)V
7: return
LineNumberTable:
line 9: 0
line 10: 7
public static void sortByLength(java.util.List<java.lang.String>);
descriptor: (Ljava/util/List;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=1, args_size=1
0: aload_0
1: invokedynamic #19, 0 // InvokeDynamic #0:compare:()Ljava/util/Comparator;
6: invokestatic #23 // Method java/util/Collections.sort:(Ljava/util/List;Ljava/util/Comparator;)V
9: return
LineNumberTable:
line 13: 0
line 14: 9
Signature: #43 // (Ljava/util/List<Ljava/lang/String;>;)V
public static void sortByLengthAnonymas(java.util.List<java.lang.String>);
descriptor: (Ljava/util/List;)V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: new #29 // class Main$1
4: dup
5: invokespecial #31 // Method Main$1."<init>":()V
8: invokestatic #23 // Method java/util/Collections.sort:(Ljava/util/List;Ljava/util/Comparator;)V
11: return
LineNumberTable:
line 17: 0
line 23: 11
Signature: #43 // (Ljava/util/List<Ljava/lang/String;>;)V
private static int lambda$sortByLength$0(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)I
flags: (0x100a) ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: invokevirtual #32 // Method java/lang/String.length:()I
4: aload_1
5: invokevirtual #32 // Method java/lang/String.length:()I
8: isub
9: ireturn
LineNumberTable:
line 13: 0
}
SourceFile: "Main.java"
NestMembers:
Main$1
BootstrapMethods:
0: #51 REF_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:
#58 (Ljava/lang/Object;Ljava/lang/Object;)I
#60 REF_invokeStatic Main.lambda$sortByLength$0:(Ljava/lang/String;Ljava/lang/String;)I
#63 (Ljava/lang/String;Ljava/lang/String;)I
InnerClasses:
#29; // class Main$1
public static final #69= #65 of #67; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
import java.lang.String;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
sortByLength(Arrays.asList(args));
}
public static void sortByLength(List<String> list) {
Collections.sort(list, (o1, o2) -> o1.length() - o2.length());
}
public static void sortByLengthAnonymas(List<String> list) {
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
}
}
del *.class
javac *.java
java -Djdk.internal.lambda.dumpProxyClasses=. Main
javap -verbose -private *.class > class.rb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment