[英]Illegal reflective access on Streams using reflection
我正在使用反射来调用 java.util.stream.Stream 上的方法,但由于实际实现(ReferencePipeline 等)具有运行的实际代码,因此在调用method.setAccessible(true)
时会收到非法反射访问警告,并且没有那个电话,它不起作用。 我想知道是否有办法自动将其委托给访问不非法的超级方法? 也就是说,我想在java.util.stream.Stream
上合法的地方调用filter
而不是ReferencePipeline
或任何实现。
编辑这是一些代码。 target
是通过反射获得的 Stream 的具体实例。
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);
}
使用接口类Stream
而不是实现类target.getClass()
。 将代码更改为:
Method candidate = Stream.of(Stream.class.getMethods())
.filter(method -> method.getName().equals("filter"))
...
问题的根本原因是java.util.stream.ReferencePipeline
以及java.util.stream.ReferencePipeline.Head
受到包保护。 即使filter()
方法本身定义为public
您的类也无法使用反射访问这些类。
Stream.class.getMethods()
方法将起作用,因为您的类可以访问公共Stream
类。 请参阅sun.reflect.Reflection.ensureMemberAccess()
检查您是否需要详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.