Я понимаю, что publicLookup()
быстрее, чем lookup()
для общедоступных методов, и я хотел бы использовать это. Если бы я должен был использовать MethodHandles.publicLookup().unreflect(Method)
на Method
, который не является общедоступным, но я назвал setAccessible(true)
, будет ли он работать?Объединение методаHandles.publicLookup() с Method.setAccessible (true)
ответ
Поскольку 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");
ах, к сожалению, мне не нужно запускать это, чтобы знать результат, поскольку я уже с ним сталкивался. однако, спасибо за ответ – DziNeIT
Почему бы не попробовать его и узнать? –