将 MethodHandles.publicLookup() 与 Method.setAccessible(true)



我知道publicLookup()比公共方法的lookup()更快,我想利用它。如果我在一个本质上不是公开的Method上使用MethodHandles.publicLookup().unreflect(Method),但我已经调用了setAccessible(true),它会起作用吗?

由于每个人都可以调用成功调用setAccessible(true)Method,因此可以使用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");

相关内容

  • 没有找到相关文章

最新更新