我有一个单元测试,可以搜索我的项目并查找特定接口的所有实现。然后对于作为内部类的每个实现,我断言它不捕获外部类。
我使用Reflections库来做到这一点,它确实有效,但现在我需要测试另一个接口,其中许多实现都是lambdas。遗憾的是, Reflections 无法找到接口的lambda实现。
我可以使用另一种可以与lambdas一起使用的解决方案吗?
答案 0 :(得分:4)
Reflections无法找到接口的lambda实现。在那儿 我可以使用的另一个解决方案是lambdas吗?
没有可靠的方法来使用反射来识别功能接口的实例,并且它看起来不会像往常一样。请参阅对Introduce a compiler option to store generic type information about a lambda expression using the Signature Attribute的openjdk请求的回复:
我明白为什么人们想要反射来处理lambda实例,但是 这不是反射如何运作 - 反思反映了课程, 不是实例。 目前的翻译策略恰好是一个 如果这个属性在那里,将启用反射 "意外工作"提供通用信息,但将 改变,此时任何基于反思的策略都会崩溃(at 哪一点人们指责打破他们的 应该从来没有在第一名的代码工作。)
以类似的方式,请参阅此SO帖子Why are Java 8 lambdas invoked using invokedynamic?
中的这些评论(也来自Brian Goetz)运行时实现可以自由选择动态策略 评估lambda表达式。运行时实现选择是 隐藏在标准化的背后(即平台的一部分) 规范)用于lambda构造的API,使静态 编译器可以发出对此API的调用, JRE实现可以 选择他们首选的实施策略。
最重要的是,您无法知道在运行时如何处理lambda表达式。