MethodHandle 与 invokeDynmic

methodHandle

这个是java 7 开始的特性,和invokeDynamic 一起的,目的就是在运行时确定目标调用的方法,
methodHandle 是方法句柄,类似方法指针,调用的时候,将指针传递即可,

  1. 生成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);
  1. 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());

invokeDynamic


评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注