invokedynamic底层机制的基石:方法句柄。
方法句柄是一个强类型的、能够被直接执行的引用。只关心返回值类型和方法的参数类型。
方法句柄的权限检查发生在创建过程中,相较于反射调用节省了调用时反复权限检查的开销。如果一个私有字段,Lookup对象是在私有字段所在类中获取的,那么Lookup对象便拥有该私有字段的访问权限。
方法句柄 API 有一个特殊的注解类 @PolymorphicSignature。在碰到被它注解的方法调用时,Java 编译器会根据所传入参数的声明类型来生成方法描述符,而不是采用目标方法所声明的描述符。
方法句柄的操作
invokeExact
需要严格匹配参数类型,不能有形参父类实参子类的情况。
invoke
可以自动适配参数类型。调用MethodHandle.asType方法,生成一个适配器方法句柄,对传入的参数进行适配,再调用原方法句柄。返回值也同样需要适配再返回。
两个重要的类
MethodHandle
它是一个有能力安全调用方法的对象。类似于反射的Method类,本质上都是模拟调用。反射是Java代码层次的方法调用,方法句柄是模拟字节码层次的方法调用。
MethodType
表示方法签名类型的不可变对象。每个方法句柄都有一个MethodType实例,用来指明被调用方法的返回类型和参数类型。
参考:https://www.cnblogs.com/bianjunting/p/13859038.html