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



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

我使用反射库来完成这项工作,它确实起了作用,但现在我需要测试另一个接口,它的许多实现都是lambda。遗憾的是,Reflections找不到接口的lambda实现。

有没有其他解决方案可以使用lambdas?

Reflections找不到接口的lambda实现。有吗我可以使用的另一个解决方案将与lambdas一起工作?

没有可靠的方法可以使用反射来识别函数接口的实例,而且看起来也不会有。请参阅对openjdk请求的此响应,以引入编译器选项,使用Signature Attribute存储有关lambda表达式的泛型类型信息:

我明白为什么人们希望反射在lambda实例上工作,但是反射不是这样工作的——反射在类上反射,而不是实例当前的翻译策略恰好是如果有这个属性,将使反射"意外工作"以提供一般信息,但这更改,此时任何基于反射的策略都会崩溃(在人们指责哪一点破坏了他们的代码本来就不应该工作。)

同样,请参阅这篇SO文章中的这些评论(同样来自Brian Goetz)为什么Java 8 lambdas使用invokedynamic调用?

运行时实现可以自由地动态选择策略计算lambda表达式运行时实现选项是隐藏在标准化(即平台的一部分规范)API用于lambda构造,以便编译器可以发出对此API的调用,JRE实现可以选择他们首选的实施策略

最重要的是,您不知道在运行时将如何处理lambda表达式。

最新更新