将BoundMethodHandle转换为反射

时间:2018-09-07 14:34:52

标签: java reflection bytecode

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

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

1 个答案:

答案 0 :(得分:2)

正确的术语是“直接方法句柄”,以强调与类成员有直接连接的事实。或如the documentation所述:

  

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

“绑定”一词更倾向于暗示存在预先绑定的参数值或绑定的接收器,它们不再与普通的反射对象匹配。

Java 8允许通过MethodHandles.Lookup.revealDirect(…)MethodHandle获取成员:

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对象所描述的上下文兼容的Reflection对象,即,当尝试通过名称查找相同成员并通过该查找对象成功键入相同成员时,它将起作用。