-Djdk.internal.lambda.dumpProxyClasses

    1、剖析lambda表达式的底层实现原理

    @FunctionalInterface


    编译系统编译lambda表达式的时候,会有哪些变化
    常量池多出
    Dynamic_info
    两个MethodHandle
    一个MethodType
    方法
    invokedynamic
    将lambda表达式代码块生成一个方法
    类属性
    BootstrapMethods


    编译系统 javac
    运行系统 java



    JVM是如何执行lambda表达式的


    0 invokedynamic #2
    1、会生成一个对象:CustomLambda的实现类对象
    2、将对象入栈
    5 astore_1
    1、拿到栈顶元素
    2、给局部变量表index=1的位置赋值
    6 aload_1
    7 invokeinterface #3 count 1
    12 return




    ()V
    ()Lcom/ziya/jvm/example/java/lang/lambda/CustomLambda;


    dynamic_info
    1、描述信息
    run run方法与lambda$main$0进行关联
    返回值 玩字节码,需要知道返回的对象结构
    2、bootstrapMethod




    1、invokedynamic 支持动态调用
    2、BootstrapMethod
    Bootstrap方法
    java/lang/invoke/LambdaMetafactory.metafactory
    最核心的部分 自实现也是基于这个方法


    CallSite 动态调用点


    参数
    metafactory方法的参数




    MethodHandle

    TestLamda->Lambda表达式

    MethodHandles.Lookup lookup = MethodHandles.lookup(); TestLamda对应的lookup
    自实现的JVM->TestLamda->Lambda表达式 如何生成lookup
    TestLamda对应的lookup


    MethodHandles.lookup(TestLamda.class);


    MethodHandles
    MethodType


    MethodHandle+反射来实现





    2、如何手写实现
    无参
    有参
    3、两种实现方式
    MethodHandle
    javaassist
    4、代码讲解