java8 lambda 嵌套使用 样例 和 解析 1

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值