是否有可能获得实现接口的所有类?

我可以用reflection或类似的东西来做吗?

没有100%可靠的方法来做你想要的。 原因是因为类加载在Java中是如何工作的。

Java中的类是“按需”加载的。 第一次在代码中引用类(静态或动态)时,JVM将使用当前的类加载器并尝试加载它。 ClassLoader没有提供可以从中加载的所有类的方法,因此您无法对类进行迭代。

有一些不可靠的解决方法 。 例如,如果您知道您的ClassLoader只会从特定目录或特定JAR文件中加载类,那么您可以使用与文件系统相关的类来查找可用的“.class”文件,然后您就可以加载所有东西(这需要花费时间并且会消耗很多你的PermGen,这可能是一个问题 – 记住你不能轻松卸载一个类!(除非你做一些ClassLoader魔术)),并使用reflection过滤实现你的类接口。

此解决方法的问题在于,如果您更改部署,它很可能会停止工作。 例如,如果您开始部署JAR文件,那么稍后您决定使用将处理WAR文件的servlet容器,您的代码可能不再起作用。

如果你真的想尝试这种方法,那么有一个名为Reflections的项目可能很有用。

我实现过最可靠的方法是使用注释处理器 。 您编写注释,注释您的接口,并编写一些代码,这些代码将在编译时由编译器执行,它将收集实现您的接口的类并将其名称保存在资源文件中。 然后编写一个带有读取该文件的方法的类,并为该资源文件中列出的每个类名提供一个Class对象。

这种方法的问题是只列出在我的构建过程中编译的类(即,如果你发布一个带有接口的库并希望其他人实现你的接口,这种方法将没有用,因为你的代码将会从来不了解别人项目中的课程。 如果这对你来说足够了,就像我一样,这个解决方案可以完美运行。 我可以在带有WAR(爆炸或非爆炸)部署的Servlet容器中,在可执行的jar中使用它,无论如何。 它总是有效的。