首页 > 解决方案 > 将 BoundMethodHandle 转换为反射

问题描述

是否可以检索使用 MethodHandle 引用的成员?

MethodHandle mh = MethodHandles.lookup().findStatic(..., ..., ...);
java.lang.reflect.Method method = convertToReflection(mn); //???

标签: javareflectionbytecode

解决方案


正确的术语是“直接方法句柄”,以强调与类成员存在直接连接这一事实。或者正如文档所说:

直接方法句柄表示没有任何干预参数绑定或其他转换的方法、构造函数或字段。

术语“绑定”宁愿暗示有预先绑定的参数值或绑定的接收器,它们不再匹配普通的反射对象。

Java 8 允许从MethodHandlevia获取成员MethodHandles.Lookup.revealDirect(…)

public class Tmp {
    public static void main(String[] args) throws ReflectiveOperationException {
        MethodHandles.Lookup lookup = MethodHandles.lookup();
        MethodHandle mh = lookup
          .findStatic(Tmp.class, "main", MethodType.methodType(void.class, String[].class));
        Method method = lookup.revealDirect(mh).reflectAs(Method.class, lookup);
        System.out.println(method);
    }
}

它受限于与您提供的对象所描述的上下文兼容的反射对象Lookup,即,当尝试通过名称和类型查找相同的成员时,它将工作该查找对象会成功。


推荐阅读