Объединение 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");