代码之家  ›  专栏  ›  技术社区  ›  Sina Madani

对使用反射的流进行非法的反射访问

  •  1
  • Sina Madani  · 技术社区  · 6 年前

    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);
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Karol Dowbecki    6 年前

    使用接口类 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() 因为你的类可以访问公共 班级。看到了吗 sun.reflect.Reflection.ensureMemberAccess()

    推荐文章