gpt4 book ai didi

java - `lookup.unreflect()` 和 `lookup.findVirtual()` 有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-31 20:19:21 25 4
gpt4 key购买 nike

我尝试了两种方法来获取给定函数的 MethodHandle。

Method 1

Method m = MyClass.class.getMethod("myMethod", String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().unreflect(m);

Method 2

MethodType type = MethodType.methodType(void.class, String.class, Map.class);
MethodHandle mh = MethodHandles.lookup().findVirtual(MyClass.class, "myMethod", type);

两者有什么区别?

最佳答案

显然,unreflect 已解决的方法,因此不需要进行查找。此外,它的输出取决于 Method你提供一个static方法将产生一个调用 static 的句柄方法 findVirtual显式请求一个虚拟 方法调用。请记住 MyClass.class.getMethod("myMethod", String.class, Map.class)也可能会找到 static接受 String 的方法和一个 Map .

此外,如果setAccessible(true)已应用于Method例如,您可能会获得一个句柄来访问一个无法访问的方法,而使用 findVirtual 是不可能的。 .

另一方面,findVirtual可能会找到适当类型的签名多态方法调用MethodHandle.invokeMethodHandle.invokeExact无法通过 java.lang.reflect.Method 访问.

关于java - `lookup.unreflect()` 和 `lookup.findVirtual()` 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538832/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com