将 BoundMethodHandle 转换为反射

Convert BoundMethodHandle to reflection

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

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

正确的术语是“直接方法句柄”,以强调与 class 的成员有直接联系这一事实。或者如 the documentation 所说:

A direct method handle represents a method, constructor, or field without any intervening argument bindings or other transformations.

术语“绑定”更像是暗示有预先绑定的参数值或绑定的接收器,这将不再匹配普通的反射对象。

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 对象所描述的上下文兼容的反射对象,即当尝试通过名称和类型查找同一成员时它会起作用,该查找对象会成功。