java版本:“D:\Program Files\Java\jdk1.8.0_191\bin\java”
代码1:
package com.example.accept;
public interface FunctionInterface {
@FunctionalInterface
interface FunctionIA{
FunctionIB testa(String a);
}
@FunctionalInterface
interface FunctionIB{
String testb(String b);
}
@FunctionalInterface
interface FunctionIC{
FunctionIB testc(String c);
//default void foo(){}
}
}
代码2:
package com.example.accept;
import java.util.function.Function;
public class FunctionInterfaceTest {
public static void main(String[] args){
FunctionInterfaceTest functionInterfaceTest = new FunctionInterfaceTest();
functionInterfaceTest.loada();
functionInterfaceTest.say(1);
/*FunctionInterface.FunctionIB b = (x)->{
System.out.println(x);
return x;
};
b.testb("s");*/
}
private int say(int a){
return a;
}
private void load(FunctionInterface.FunctionIB functionIB){
String sab = functionIB.testb("ddd");
System.out.println(sab);
}
private void load(FunctionInterface.FunctionIA functionIa){
load(functionIa.testa("assff"));
}
public void loada(){
FunctionInterface.FunctionIA ia = this::getFunctionIb;
//load(this::getFunctionIb);
final Function<Integer, Integer> say = this::say;
load(ia);
}
private FunctionInterface.FunctionIB getFunctionIb(String s){
return b -> b + "ssss" + s;
}
}
代码运行结果:
dddssssassff
在 FunctionInterfaceTest.class 目录下 打开cmd 执行 javap -v -p -l FunctionInterfaceTest 命令
javap内容:
D:\sincere\idea-workspace\demo\target\classes\com\example\accept>javap -v -p -l FunctionInterfaceTest
警告: 二进制文件FunctionInterfaceTest包含com.example.accept.FunctionInterfaceTest
Classfile /D:/sincere/idea-workspace/demo/target/classes/com/example/accept/FunctionInterfaceTest.class
Last modified 2019-2-14; size 3073 bytes
MD5 checksum a17afb9baa7d414b3514abcf20c5d4aa
Compiled from "FunctionInterfaceTest.java"
public class com.example.accept.FunctionInterfaceTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #22.#66 // java/lang/Object."<init>":()V
#2 = Class #67 // com/example/accept/FunctionInterfaceTest
#3 = Methodref #2.#66 // com/example/accept/FunctionInterfaceTest."<init>":()V
#4 = Methodref #2.#68 // com/example/accept/FunctionInterfaceTest.loada:()V
#5 = Methodref #2.#69 // com/example/accept/FunctionInterfaceTest.say:(I)I
#6 = String #70 // ddd
#7 = InterfaceMethodref #40.#71 // com/example/accept/FunctionInterface$FunctionIB.testb:(Ljava/lang/String;)Ljava/lang/String;
#8 = Fieldref #72.#73 // java/lang/System.out:Ljava/io/PrintStream;
#9 = Methodref #74.#75 // java/io/PrintStream.println:(Ljava/lang/String;)V
#10 = String #76 // assff
#11 = InterfaceMethodref #48.#77 // com/example/accept/FunctionInterface$FunctionIA.testa:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#12 = Methodref #2.#78 // com/example/accept/FunctionInterfaceTest.load:(Lcom/example/accept/FunctionInterface$FunctionIB;)V
#13 = InvokeDynamic #0:#83 // #0:testa:(Lcom/example/accept/FunctionInterfaceTest;)Lcom/example/accept/FunctionInterface$FunctionIA;
#14 = InvokeDynamic #1:#87 // #1:apply:(Lcom/example/accept/FunctionInterfaceTest;)Ljava/util/function/Function;
#15 = Methodref #2.#88 // com/example/accept/FunctionInterfaceTest.load:(Lcom/example/accept/FunctionInterface$FunctionIA;)V
#16 = InvokeDynamic #2:#91 // #2:testb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#17 = Class #92 // java/lang/StringBuilder
#18 = Methodref #17.#66 // java/lang/StringBuilder."<init>":()V
#19 = Methodref #17.#93 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#20 = String #94 // ssss
#21 = Methodref #17.#95 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#22 = Class #96 // java/lang/Object
#23 = Utf8 <init>
#24 = Utf8 ()V
#25 = Utf8 Code
#26 = Utf8 LineNumberTable
#27 = Utf8 LocalVariableTable
#28 = Utf8 this
#29 = Utf8 Lcom/example/accept/FunctionInterfaceTest;
#30 = Utf8 main
#31 = Utf8 ([Ljava/lang/String;)V
#32 = Utf8 args
#33 = Utf8 [Ljava/lang/String;
#34 = Utf8 functionInterfaceTest
#35 = Utf8 say
#36 = Utf8 (I)I
#37 = Utf8 a
#38 = Utf8 I
#39 = Utf8 load
#40 = Class #98 // com/example/accept/FunctionInterface$FunctionIB
#41 = Utf8 FunctionIB
#42 = Utf8 InnerClasses
#43 = Utf8 (Lcom/example/accept/FunctionInterface$FunctionIB;)V
#44 = Utf8 functionIB
#45 = Utf8 Lcom/example/accept/FunctionInterface$FunctionIB;
#46 = Utf8 sab
#47 = Utf8 Ljava/lang/String;
#48 = Class #99 // com/example/accept/FunctionInterface$FunctionIA
#49 = Utf8 FunctionIA
#50 = Utf8 (Lcom/example/accept/FunctionInterface$FunctionIA;)V
#51 = Utf8 functionIa
#52 = Utf8 Lcom/example/accept/FunctionInterface$FunctionIA;
#53 = Utf8 loada
#54 = Utf8 ia
#55 = Utf8 Ljava/util/function/Function;
#56 = Utf8 LocalVariableTypeTable
#57 = Utf8 Ljava/util/function/Function<Ljava/lang/Integer;Ljava/lang/Integer;>;
#58 = Utf8 getFunctionIb
#59 = Utf8 (Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#60 = Utf8 s
#61 = Utf8 lambda$getFunctionIb$0
#62 = Utf8 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
#63 = Utf8 b
#64 = Utf8 SourceFile
#65 = Utf8 FunctionInterfaceTest.java
#66 = NameAndType #23:#24 // "<init>":()V
#67 = Utf8 com/example/accept/FunctionInterfaceTest
#68 = NameAndType #53:#24 // loada:()V
#69 = NameAndType #35:#36 // say:(I)I
#70 = Utf8 ddd
#71 = NameAndType #100:#101 // testb:(Ljava/lang/String;)Ljava/lang/String;
#72 = Class #102 // java/lang/System
#73 = NameAndType #103:#104 // out:Ljava/io/PrintStream;
#74 = Class #105 // java/io/PrintStream
#75 = NameAndType #106:#107 // println:(Ljava/lang/String;)V
#76 = Utf8 assff
#77 = NameAndType #108:#59 // testa:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#78 = NameAndType #39:#43 // load:(Lcom/example/accept/FunctionInterface$FunctionIB;)V
#79 = Utf8 BootstrapMethods
#80 = MethodHandle #6:#109 // 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;
#81 = MethodType #59 // (Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#82 = MethodHandle #7:#110 // invokespecial com/example/accept/FunctionInterfaceTest.getFunctionIb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$Function
IB;
#83 = NameAndType #108:#111 // testa:(Lcom/example/accept/FunctionInterfaceTest;)Lcom/example/accept/FunctionInterface$FunctionIA;
#84 = MethodType #112 // (Ljava/lang/Object;)Ljava/lang/Object;
#85 = MethodHandle #7:#5 // invokespecial com/example/accept/FunctionInterfaceTest.say:(I)I
#86 = MethodType #113 // (Ljava/lang/Integer;)Ljava/lang/Integer;
#87 = NameAndType #114:#115 // apply:(Lcom/example/accept/FunctionInterfaceTest;)Ljava/util/function/Function;
#88 = NameAndType #39:#50 // load:(Lcom/example/accept/FunctionInterface$FunctionIA;)V
#89 = MethodType #101 // (Ljava/lang/String;)Ljava/lang/String;
#90 = MethodHandle #6:#116 // invokestatic com/example/accept/FunctionInterfaceTest.lambda$getFunctionIb$0:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
#91 = NameAndType #100:#59 // testb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#92 = Utf8 java/lang/StringBuilder
#93 = NameAndType #117:#118 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#94 = Utf8 ssss
#95 = NameAndType #119:#120 // toString:()Ljava/lang/String;
#96 = Utf8 java/lang/Object
#97 = Class #121 // com/example/accept/FunctionInterface
#98 = Utf8 com/example/accept/FunctionInterface$FunctionIB
#99 = Utf8 com/example/accept/FunctionInterface$FunctionIA
#100 = Utf8 testb
#101 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#102 = Utf8 java/lang/System
#103 = Utf8 out
#104 = Utf8 Ljava/io/PrintStream;
#105 = Utf8 java/io/PrintStream
#106 = Utf8 println
#107 = Utf8 (Ljava/lang/String;)V
#108 = Utf8 testa
#109 = Methodref #122.#123 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;L
java/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
#110 = Methodref #2.#124 // com/example/accept/FunctionInterfaceTest.getFunctionIb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#111 = Utf8 (Lcom/example/accept/FunctionInterfaceTest;)Lcom/example/accept/FunctionInterface$FunctionIA;
#112 = Utf8 (Ljava/lang/Object;)Ljava/lang/Object;
#113 = Utf8 (Ljava/lang/Integer;)Ljava/lang/Integer;
#114 = Utf8 apply
#115 = Utf8 (Lcom/example/accept/FunctionInterfaceTest;)Ljava/util/function/Function;
#116 = Methodref #2.#125 // com/example/accept/FunctionInterfaceTest.lambda$getFunctionIb$0:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
#117 = Utf8 append
#118 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#119 = Utf8 toString
#120 = Utf8 ()Ljava/lang/String;
#121 = Utf8 com/example/accept/FunctionInterface
#122 = Class #126 // java/lang/invoke/LambdaMetafactory
#123 = NameAndType #127:#130 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/l
ang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
#124 = NameAndType #58:#59 // getFunctionIb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#125 = NameAndType #61:#62 // lambda$getFunctionIb$0:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
#126 = Utf8 java/lang/invoke/LambdaMetafactory
#127 = Utf8 metafactory
#128 = Class #132 // java/lang/invoke/MethodHandles$Lookup
#129 = Utf8 Lookup
#130 = 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;
#131 = Class #133 // java/lang/invoke/MethodHandles
#132 = Utf8 java/lang/invoke/MethodHandles$Lookup
#133 = Utf8 java/lang/invoke/MethodHandles
{
public com.example.accept.FunctionInterfaceTest();
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 5: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lcom/example/accept/FunctionInterfaceTest;
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: new #2 // class com/example/accept/FunctionInterfaceTest
3: dup
4: invokespecial #3 // Method "<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method loada:()V
12: aload_1
13: iconst_1
14: invokespecial #5 // Method say:(I)I
17: pop
18: return
LineNumberTable:
line 8: 0
line 9: 8
line 10: 12
line 18: 18
LocalVariableTable:
Start Length Slot Name Signature
0 19 0 args [Ljava/lang/String;
8 11 1 functionInterfaceTest Lcom/example/accept/FunctionInterfaceTest;
private int say(int);
descriptor: (I)I
flags: ACC_PRIVATE
Code:
stack=1, locals=2, args_size=2
0: iload_1
1: ireturn
LineNumberTable:
line 21: 0
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this Lcom/example/accept/FunctionInterfaceTest;
0 2 1 a I
private void load(com.example.accept.FunctionInterface$FunctionIB);
descriptor: (Lcom/example/accept/FunctionInterface$FunctionIB;)V
flags: ACC_PRIVATE
Code:
stack=2, locals=3, args_size=2
0: aload_1
1: ldc #6 // String ddd
3: invokeinterface #7, 2 // InterfaceMethod com/example/accept/FunctionInterface$FunctionIB.testb:(Ljava/lang/String;)Ljava/lang/String;
8: astore_2
9: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
12: aload_2
13: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
16: return
LineNumberTable:
line 25: 0
line 26: 9
line 27: 16
LocalVariableTable:
Start Length Slot Name Signature
0 17 0 this Lcom/example/accept/FunctionInterfaceTest;
0 17 1 functionIB Lcom/example/accept/FunctionInterface$FunctionIB;
9 8 2 sab Ljava/lang/String;
private void load(com.example.accept.FunctionInterface$FunctionIA);
descriptor: (Lcom/example/accept/FunctionInterface$FunctionIA;)V
flags: ACC_PRIVATE
Code:
stack=3, locals=2, args_size=2
0: aload_0
1: aload_1
2: ldc #10 // String assff
4: invokeinterface #11, 2 // InterfaceMethod com/example/accept/FunctionInterface$FunctionIA.testa:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$Fun
ctionIB;
9: invokespecial #12 // Method load:(Lcom/example/accept/FunctionInterface$FunctionIB;)V
12: return
LineNumberTable:
line 30: 0
line 31: 12
LocalVariableTable:
Start Length Slot Name Signature
0 13 0 this Lcom/example/accept/FunctionInterfaceTest;
0 13 1 functionIa Lcom/example/accept/FunctionInterface$FunctionIA;
public void loada();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=1
0: aload_0
1: invokedynamic #13, 0 // InvokeDynamic #0:testa:(Lcom/example/accept/FunctionInterfaceTest;)Lcom/example/accept/FunctionInterface$FunctionIA;
6: astore_1
7: aload_0
8: invokedynamic #14, 0 // InvokeDynamic #1:apply:(Lcom/example/accept/FunctionInterfaceTest;)Ljava/util/function/Function;
13: astore_2
14: aload_0
15: aload_1
16: invokespecial #15 // Method load:(Lcom/example/accept/FunctionInterface$FunctionIA;)V
19: return
LineNumberTable:
line 34: 0
line 36: 7
line 37: 14
line 38: 19
LocalVariableTable:
Start Length Slot Name Signature
0 20 0 this Lcom/example/accept/FunctionInterfaceTest;
7 13 1 ia Lcom/example/accept/FunctionInterface$FunctionIA;
14 6 2 say Ljava/util/function/Function;
LocalVariableTypeTable:
Start Length Slot Name Signature
14 6 2 say Ljava/util/function/Function<Ljava/lang/Integer;Ljava/lang/Integer;>;
private com.example.accept.FunctionInterface$FunctionIB getFunctionIb(java.lang.String);
descriptor: (Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
flags: ACC_PRIVATE
Code:
stack=1, locals=2, args_size=2
0: aload_1
1: invokedynamic #16, 0 // InvokeDynamic #2:testb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
6: areturn
LineNumberTable:
line 41: 0
LocalVariableTable:
Start Length Slot Name Signature
0 7 0 this Lcom/example/accept/FunctionInterfaceTest;
0 7 1 s Ljava/lang/String;
private static java.lang.String lambda$getFunctionIb$0(java.lang.String, java.lang.String);
descriptor: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=2, locals=2, args_size=2
0: new #17 // class java/lang/StringBuilder
3: dup
4: invokespecial #18 // Method java/lang/StringBuilder."<init>":()V
7: aload_1
8: invokevirtual #19 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
11: ldc #20 // String ssss
13: invokevirtual #19 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
16: aload_0
17: invokevirtual #19 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
20: invokevirtual #21 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
23: areturn
LineNumberTable:
line 41: 0
LocalVariableTable:
Start Length Slot Name Signature
0 24 0 s Ljava/lang/String;
0 24 1 b Ljava/lang/String;
}
SourceFile: "FunctionInterfaceTest.java"
InnerClasses:
public static #41= #40 of #97; //FunctionIB=class com/example/accept/FunctionInterface$FunctionIB of class com/example/accept/FunctionInterface
public static #49= #48 of #97; //FunctionIA=class com/example/accept/FunctionInterface$FunctionIA of class com/example/accept/FunctionInterface
public static final #129= #128 of #131; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
BootstrapMethods:
0: #80 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/Method
Type;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#81 (Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#82 invokespecial com/example/accept/FunctionInterfaceTest.getFunctionIb:(Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
#81 (Ljava/lang/String;)Lcom/example/accept/FunctionInterface$FunctionIB;
1: #80 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/Method
Type;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#84 (Ljava/lang/Object;)Ljava/lang/Object;
#85 invokespecial com/example/accept/FunctionInterfaceTest.say:(I)I
#86 (Ljava/lang/Integer;)Ljava/lang/Integer;
2: #80 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/Method
Type;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#89 (Ljava/lang/String;)Ljava/lang/String;
#90 invokestatic com/example/accept/FunctionInterfaceTest.lambda$getFunctionIb$0:(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
#89 (Ljava/lang/String;)Ljava/lang/String;
问题:
1. invokeDynamic 指令执行原理是什么 和 其他 4 个指令 (invokeSpecial,invokeInterface,invokeVirtual,invokeStatic) 指令简单介绍
2. 样例中 代码的执行顺序 是什么
3. this::xx 代表什么 , jvm 是如何 解析的
4. x -> xxx 代表什么 ,jvm 是如何 解析的
5. 为什么 getFunctionIb 的 返回类型是 FunctionIB, 上边 却用 FunctionIA 来接收?
6. 为什么load(ia) 调用的 是 方法2 却不是 方法1?
7. 为什么 这条invokeDynamic指令 描述的 方法 testa 的参数里 会带 FunctionInterfaceTest?
8. 这个方法是怎么来的?
9. 这个方法怎么来的,为什么会用 两个String类型 参数?
java8 lambda 嵌套使用 样例 和 解析 2 https://blog.csdn.net/q873297050/article/details/87359338