谈一谈Java反射,序章内容


谈一谈Java反射 (下)

​ 在Java 7版本中, 为了增强反射, 提高反射调用方法的效率, Java引入了一种全新的反射调用方式, 即MethodHandle 调用

​ 根据Javadoc

>  A method handle is a typed, directly executable reference to an underlying method, constructor, field, or similar low-level operation, with optional transformations of arguments or return values. These transformations are quite general, and include such patterns as [conversion](https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandle.html#asType-java.lang.invoke.MethodType-), [insertion](https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandle.html#bindTo-java.lang.Object-), [deletion](https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandles.html#dropArguments-java.lang.invoke.MethodHandle-int-java.util.List-), and [substitution](https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/MethodHandles.html#filterArguments-java.lang.invoke.MethodHandle-int-java.lang.invoke.MethodHandle...-). 

​ 简而言之, MethodHandle是一种底层方法,构造器,域等类似操作的直接可调引用

​ 要创建并使用 MethodHandle , 步骤如下

  1. 创建一个 Lookup 对象
  2. 创建一个 MethodType 对象
  3. 查找对应的 MethodHandle 对象
  4. 通过 MethodHandle 对象调用其方法

​ 通过采用Visual VM 测试直接通过Class#getDeclaredMethod和采用MethodHandles#lookup再分别调用发现, 传统反射时间主要消耗在对应的 MethodAccessorImplinvoke 方法上, 而 MethodHandle 相比之下在 find 方面消耗了更多的时间, 在同样任务的情况下, 采用MethodHandle的方式比直接反射提高了1倍以上

### 未完待续....