我正在进行一个多项目构建,在该构建中,我需要获取项目中的所有.class文件,然后通过其文件系统位置通过反射加载所有这些文件,考虑到这个项目结构:
multi-project
|_ /app/
| |_ src/
|_ /notification/
| |_ /src/
|_ settings.gradle在这个多项目构建中,我的应用程序项目依赖于这样的通知项目
dependencies {
implementation project(":notification")
// other dependencies
}虽然在这一点上它看起来像一个与等级相关的问题,但它不是,它是与构建工具无关的。
目前我正在处理app项目,但是我需要动态加载位于通知项目上的所有类,我通常通过检查项目的文件位置来实现这一点,但是我需要从位于app项目中的类中获取通知项目的位置。
为了捕获路径,我使用ClassLoader.getResources()加载了app项目的所有类,但是这个类加载器无法捕获通知项目的路径
发布于 2022-03-26 23:06:17
类路径抽象根本上没有“列表资源”的概念。它只是“给我资源X",这就是全部。
因此,“我希望获得所有类的列表,以便通过反射加载它们”是不可能没有黑客的。
幸运的是,有一个实际的解决办法。资源清单。通常,通过使用SPI ()系统。
在编译期间(在编译过程中,编译器/构建工具确实有一个完整的清单,列出了它正在编译的所有内容),将创建一个文本文件。它包含每个相关类的完全限定类名,每一行一个这样的名称。然后将这个文本文件包含在jar文件中。现在,您可以使用java的ClassLoader公开的API构建‘给我每个项目X类的一个实例’的过程。
Class.loadClass(thatLine).getConstructor().newInstance(),将其转换为com.foo.YourInterface并将其添加到列表中。瞧。不需要“列表”指令(不存在)。在查找SQL驱动程序、字符集编码驱动程序、密码实现等方面,java本身就是这样工作的。
如何做到这一点的基础取决于您的构建系统。编译步骤(“创建一个包含所有实现的文本文件”)依赖于构建;您可以手工编写它,也可以编写自己的构建插件,或者使用现有的注释处理器扫描注释并自动生成它。
运行时组件(使用类路径上的文本文件,即在类文件所在的jar中,加载其中列出的每个类,实例化它们,并将其作为实例列表返回给我)被烘焙到java本身:ServiceLoader中。
发布于 2022-03-26 23:40:40
我想我不是很清楚,因为这是我的第一个问题,我只是需要文件系统路径到另一个项目,我可以找到我正在寻找的通过使用System.getProperty("java.class.path")。
它包含到我需要的项目的编译jar的路径,它不是我需要的路径,但我仍然可以获得该文件的条目,它与路径本身一样有用。
https://stackoverflow.com/questions/71632299
复制相似问题