没有 100% 可靠的方法可以做你想做的事。原因是 Java 中类加载的工作方式。
Java 中的类是“按需”加载的。第一次在代码中引用类(无论是静态还是动态)时,JVM 将使用当前的类加载器并尝试加载它。 ClassLoader 没有提供可以从中加载的所有类的方法,因此您无法迭代类。
有一些不可靠的解决方法。例如,如果您知道 ClassLoader 只会从特定目录或特定 JAR 文件中加载类,那么您可以使用与文件系统相关的类来查找可用的“.class”文件,然后您可以加载所有内容(这需要时间并且会消耗大量 PermGen,这可能是一个问题 - 请记住,您无法轻松卸载类!(除非您执行一些 ClassLoader 魔法)),并使用反射来过滤实现您的类界面。
此解决方法的问题在于,如果您更改部署,它很可能会停止工作。例如,如果您开始部署 JAR 文件,然后您决定使用处理 WAR 文件的 servlet 容器,您的代码可能不再工作。
如果你真的想尝试这种方法,有一个名为反思 https://code.google.com/p/reflections/这可能有用。
The 我实现过的最可靠的方法是使用注释处理器。您编写一个注释,注释您的接口,然后编写一些将由编译器在编译时执行的代码,这些代码将收集实现您的接口的类并将它们的名称保存在资源文件中。然后,您使用读取该文件的方法编写一个类,并为该资源文件中列出的每个类名提供一个 Class 对象。
这种方法的问题是,只有在我的构建过程中编译的类才会被列出(即,如果您发布带有接口的库并期望其他人实现您的接口,那么这种方法将没有用,因为您的代码将永远不知道其他项目中的类)。如果这对您来说足够了,就像对我来说一样,那么这个解决方案可以完美地工作。我可以在具有 WAR(爆炸或未爆炸)部署的 Servlet 容器中、在可执行 jar 中使用它,等等。它将永远有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)