3

publicLookup()これは for public メソッドよりも高速であることを理解しておりlookup()、それを利用したいと考えています。本質的に公開されていないが、私が呼び出したもので使用する場合MethodHandles.publicLookup().unreflect(Method)、それは機能しますか?MethodsetAccessible(true)

4

1 に答える 1

5

呼び出しに成功したMethodonsetAccessible(true)は誰でも呼び出すことができるため、MethodHandles.publicLookup()他のLookupオブジェクトと同様に the like を使用して反映されないようにすることができます。

結局のところ、それ自体ではアクセス オーバーライド機能を提供しないため、 MethodHandles でアクセス オーバーライドを使用する唯一の方法です。java.lang.invoke

次のデモでは、aFieldではなく aを使用して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");
于 2014-09-19T17:42:49.883 に答える