我知道publicLookup()的速度比public方法的lookup()的速度快,我想利用它。如果我要在本身不是公共的MethodHandles.publicLookup().unreflect(Method)上使用Method,但我已将setAccessible(true)启用,它会起作用吗?

最佳答案

由于每个人都可以调用已成功调用MethodsetAccessible(true),因此可以像其他任何MethodHandles.publicLookup()对象一样,使用Lookup使它变为未反射状态。

毕竟,这是对MethodHandle使用访问覆盖的唯一方法,因为java.lang.invoke本身并不提供任何访问覆盖功能。

以下演示使用了Field而不是Method,但结果令人印象深刻:

Field m = String.class.getDeclaredField("value");
m.setAccessible(true);
MethodHandle mh = MethodHandles.publicLookup().unreflectGetter(m);
char[] ch = (char[])mh.invoke("hello");
Arrays.fill(ch, '*');
System.out.println("hello");

07-25 21:11