聊聊 Java 7 中的 MethodHandle

  1. invokevirtual——对实例方法的标准分派
  2. invokestatic——用于分派静态方法
  3. invokeinterface——用于通过接口进行方法调用的分派
  4. invokespecial——当需要进行非虚(也就是“精确”)分派时会用到

 

聊聊 Java 7 中的 MethodHandle

和反射的区别

  1. 反射是代码层次的方法调用,而MethodHandle是字节码层次的方法调用
  2. Method 比 MethodHandle 包含的信息多
  3. MethodHandle可以进行内联优化,反射完全没有。
  4. 反射是重量级,而MethodHandle是轻量级。
  5. MethodHandle服务于所有java虚拟机上的语言,反射仅服务于java语言。
聊聊 Java 7 中的 MethodHandle

MethodHandle

它是可对直接执行的方法(构造方法等)的类型的引用。
  1. 方法名
  2. 签名--参数列表和返回值
  3. 定义方法的类
  4. 方法体(代码)
聊聊 Java 7 中的 MethodHandle

MethodHandle / MethodType

  • 它是表示方法签名类型的不可变对象。
  • 每个方法句柄都有一个MethodType实例,用来指明方法的返回类型和参数类型。
  • 它完全由参数类型和方法返回类型来确定,而与它所引用的底层的方法的名称和所在的类没有关系。
聊聊 Java 7 中的 MethodHandle

invoke 和 invokeExact

  1. 如果需要的话,原始类型会进行装箱操作
  2. 如果需要的话,装箱后的原始类型会进行拆箱操作
  3. 如果必要的话,原始类型会进行扩展
  4. void返回类型会转换为0(对于返回原始类型的情况),而对于预期得到引用类型的返回值的地方,将会转换为null
  5. null值会被视为正确的,不管静态类型是什么都可以进行传递
Made with Slides.com