java - 将 BoundMethodHandle 转换为反射
问题描述
是否可以检索使用 MethodHandle 引用的成员?
MethodHandle mh = MethodHandles.lookup().findStatic(..., ..., ...);
java.lang.reflect.Method method = convertToReflection(mn); //???
解决方案
正确的术语是“直接方法句柄”,以强调与类成员存在直接连接这一事实。或者正如文档所说:
直接方法句柄表示没有任何干预参数绑定或其他转换的方法、构造函数或字段。
术语“绑定”宁愿暗示有预先绑定的参数值或绑定的接收器,它们不再匹配普通的反射对象。
Java 8 允许从MethodHandle
via获取成员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
,即,当尝试通过名称和类型查找相同的成员时,它将工作该查找对象会成功。
推荐阅读
- mysql - 试图将查询转换为 eloquent
- python - 从列表中拆分和打印元素
- javascript - 如何在散景中创建加载指示器?
- windows - Windows Echo 未转义的反斜杠
- python - 将模块(func1.py)导入test.py文件后,出现nameError: name 'pd' is not defined
- json - React:Redux 状态和关系
- swift - 如何修复此错误无法使用“(学生)”类型的参数列表调用“字符串”类型的初始化程序
- javascript - 如何在javascript中使用包含“and”的条件制作if语句
- javascript - 仅在解析异步函数后,如何使嵌套循环继续,或者如何将“.then”扩展到范围之外
- mysql - 在 Laravel 中获得最高分