2014-09-19 2 views
3

Я понимаю, что publicLookup() быстрее, чем lookup() для общедоступных методов, и я хотел бы использовать это. Если бы я должен был использовать MethodHandles.publicLookup().unreflect(Method) на Method, который не является общедоступным, но я назвал setAccessible(true), будет ли он работать?Объединение методаHandles.publicLookup() с Method.setAccessible (true)

+1

Почему бы не попробовать его и узнать? –

ответ

4

Поскольку Method, на котором setAccessible(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"); 
+0

ах, к сожалению, мне не нужно запускать это, чтобы знать результат, поскольку я уже с ним сталкивался. однако, спасибо за ответ – DziNeIT