查找包括lambdas在内的所有接口实现

时间:2017-11-07 14:48:33

标签: java reflection lambda java-8 google-reflections

我有一个单元测试,可以搜索我的项目并查找特定接口的所有实现。然后对于作为内部类的每个实现,我断言它不捕获外部类。

我使用Reflections库来做到这一点,它确实有效,但现在我需要测试另一个接口,其中许多实现都是lambdas。遗憾的是, Reflections 无法找到接口的lambda实现。

我可以使用另一种可以与lambdas一起使用的解决方案吗?

1 个答案:

答案 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表达式。