methodHandle
这个是java 7 开始的特性,和invokeDynamic 一起的,目的就是在运行时确定目标调用的方法,
methodHandle 是方法句柄,类似方法指针,调用的时候,将指针传递即可,
- 生成MethodType, 根据返回值和入参来唯一标识一个方法类型, void 是返回值时要写上,是入参就不用了.
String getJia(String name); //MethodType.methodType(String.class)
String getJia(); //MethodType.methodType(String.class)
void setJia(String name);// MethodType.methodType(void.class,String.class)
void getJun(); // MethodType.methodType(void.class);
- MethodHandles 查找MethodHandle, lookup 可以查找夫类函数,publicLookup查找共有的, 为啥这样其实private的方式和这个不一样, 比如:MethodHandles.lookup().findVirtual 是查找当前类和夫类的实例方法
findVirtual 查找实例方法
findStatic 查找静态方法
findSpecial 查找构造方法
findGetter 查找get方法,这个里面入参就放的是字段类型,里面帮我们构造了上面的MethodType
findSetter 和get类似
代码
@Data
class Ji {
public String jia;
public Ji(String jia) {
this.jia = jia;
}
}
Class jo = Ji.class;
Ji ji = new Ji("wocao");
MethodType methodType = MethodType.methodType(String.class);
MethodHandle methodHandle = MethodHandles.lookup().findVirtual(jo, "getJia", methodType);
MethodHandle methodHandleByGet = MethodHandles.lookup().findGetter(jo, "jia",
String.class);
Object wo = methodHandle.invoke(ji);
System.out.println(wo);
MethodHandle methodSet = MethodHandles.lookup().findVirtual(jo, "setJia", MethodType.methodType(void.class, String.class));
methodSet.invoke(ji, "nimeide");
System.out.println(ji.getJia());
发表回复