Я использую рефлексию для вызова методов на java.util.stream.Stream, но поскольку фактические реализации (ReferencePipeline и т. Д.) Имеют реальный код, который запускается, я получаю недопустимые рефлексивные предупреждения о доступе при вызове method.setAccessible(true)
и без этот звонок, это не работает. Мне было интересно, есть ли способ автоматически делегировать это супер-метод, где доступ не является незаконным? То есть я хочу вызвать filter
там, где это разрешено java.util.stream.Stream
, а не ReferencePipeline
или какой-либо другой реализацией.
РЕДАКТИРОВАТЬ Вот некоторый код. target
является конкретным примером потока, полученного с помощью отражения.
assert target instanceof java.util.stream.Stream;
Method candidate = Stream.of(target.getClass().getMethods())
.filter(method -> method.getName().equals("filter"))
//.filter(myComplicatedCriteria) - omitted for brevity
.findAny().orElseThrow();
try {
candidate.setAccessible(true);
return candidate.invoke(target, candidateParameterValues);
}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
throw new EolRuntimeException(ex);
}