结合 MethodHandles.publicLookup() 和 Method.setAccessible(true)

Dzi*_*eIT 3 java reflection java-8 methodhandle

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

Hol*_*ger 5

由于已成功调用的a MethodonsetAccessible(true)可以被所有人调用,因此可以对MethodHandles.publicLookup()任何其他Lookup对象使用类似的方法使其不反射。

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

下面的演示使用 aField而不是 aMethod但有一个令人印象深刻的结果:

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");
Run Code Online (Sandbox Code Playgroud)