繁体   English   中英

使用反射对 Streams 进行非法反射访问

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM