Объединение MethodHandles.publicLookup() с Method.setAccessible(true)

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

1 ответ

Решение

Так как 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");
Другие вопросы по тегам