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

Java 查找接口的所有实现,包括lambdas,java,reflection,lambda,java-8,reflections,Java,Reflection,Lambda,Java 8,Reflections,我有一个单元测试,它搜索我的项目并找到特定接口的所有实现。然后,对于作为内部类的每个实现,我断言它不会捕获外部类 我使用这个库来做这件事,它确实起了作用,但现在我需要测试另一个接口,它的许多实现都是lambdas。遗憾的是,反射无法找到接口的lambda实现 是否有另一种解决方案可用于lambdas 反射找不到接口的lambda实现。有 我可以使用的另一个解决方案将与lambdas一起使用 没有可靠的方法使用反射来识别功能接口的实例,而且看起来也不会有。请参阅以下对openjdk请求的响应: 我

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

我使用这个库来做这件事,它确实起了作用,但现在我需要测试另一个接口,它的许多实现都是lambdas。遗憾的是,反射无法找到接口的lambda实现

是否有另一种解决方案可用于lambdas

反射找不到接口的lambda实现。有 我可以使用的另一个解决方案将与lambdas一起使用

没有可靠的方法使用反射来识别功能接口的实例,而且看起来也不会有。请参阅以下对openjdk请求的响应:

我明白为什么人们希望反射处理lambda实例,但是 这不是反射的工作原理-反射在类上反射, 不是实例。目前的翻译策略恰好是这样的 如果该属性存在,将使反射能够 意外地工作,以提供一般信息,但这将 在这一点上,任何基于反射的策略都会在 人们指责哪一点违反了他们的法律 一开始就不应该使用代码

同样,也可以在本文中看到Brian Goetz的这些评论

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


归根结底,您不知道lambda表达式在运行时将如何处理。

请求库建议在这里是无关紧要的。您可以使用像ASM这样的字节码处理库来编写一个工具来查找所有lambda创建站点,但确定它们是否捕获此实例的外部数据是很棘手的,因为仅仅存在这种类型的捕获引用并不一定是这样的;它可能是一个故意捕获的相同类型的变量。另外,我想您只关心意外捕获,所以像::method这样的显式构造不应该计算在内……这是没有重点的。引用的邮件是关于希望获得lambda实例的泛型类型信息,这与这个问题无关。尽管引用的Q&A只告诉您无法定位接口实现类,因为它是特定于JRE的,但是,这并不排除查找InvokedDynamic指令,这些指令已经告诉您将实现哪个接口以及必须捕获哪些值。你不需要知道它是怎么做到的…