MethodHandle类详解

  java7为间接调用方法提供了MethodHandle类,即方法句柄。可以将其看作是反射的另一种方式,MethodHandle api要比反射快很多因为访问检查在创建的时候就已经完成了,而不是像反射一样等到运行时候才检查。但同时,Method Handles比反射更难用,因为没有列举类中成员,获取属性访问标志之类的机制。

  首先,需要得到Lookup。这是创造方法,构造函数,属性的method handles的工厂类。
// public方法的Lookup
MethodHandles.Lookup publicLookup = MethodHandles.publicLookup();
// 所有方法的Lookup
MethodHandles.Lookup lookup = MethodHandles.lookup();

  其次,创建MethodHandle,lookup需要一个定义了它的类型的MethodType对象。这里的类型包括了传入参数的类型,和最后返回的类型,要一一对应。第一个是返回类型,如果没有返回值就是Void.class, 后面是可变的传入参数的类型。

// 接收数组,返回一个List对象
MethodType mt = MethodType.methodType(List.class, Object[].class);

  再次,查找MethodHandle

  

   查找并调用

MethodType mt = MethodType.methodType(String.class, char.class, char.class);
MethodHandle replaceMH = publicLookup.findVirtual(String.class, "replace", mt);
 
String output = (String) replaceMH.invoke("jovo", Character.valueOf('o'), 'a');

 

  

posted on 2020-11-20 23:38  溪水静幽  阅读(433)  评论(0)    收藏  举报