java.lang.invoke.MethodHandle

JDK7为间接调用方法引入新的API - MethodHandle,可以看作反射的升级版。

MethodHandle是什么?简单的说就是方法句柄,通过这个句柄可以调用相应的方法

用MethodHandle调用方法的流程为:

  1. 创建MethodType,获取指定方法的签名
  2. 在Lookup中查找MethodType的方法句柄MethodHandle
  3. 传入方法参数通过MethodHandle调用方法

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class MethodHandlerTest {
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodType mt = MethodType.methodType(String.class,char.class,char.class);
try {
MethodHandle mh = lookup.findVirtual(String.class,"replace", mt);
String handled_str = (String) mh.invoke("abc",'a','c');
System.out.print(handled_str);
} catch (NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
}

输出结果:cbc

image-20200605203159266

参考链接:

https://www.cnblogs.com/Mrfanl/p/10544251.html

https://www.cnblogs.com/zhangxh20/p/7086622.html

https://www.zhihu.com/question/40427344/answer/252825611