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');
立志如山 静心求实
浙公网安备 33010602011771号