gpt4 book ai didi

java - 可扩展地添加类以在 jar 中进行实例化

转载 作者:太空宇宙 更新时间:2023-11-04 07:34:40 25 4
gpt4 key购买 nike

我需要一些关于要遵循的范式的建议。以前我也遇到过这样的事情

package/Instantiator.class

package/instances/GenericInstance.class(抽象)

package/instances/AInstance.class(扩展通用)

package/instances/BInstance.class(扩展通用)

Instantiator 所做的是在 package/instances 文件夹中搜索所有类文件,并使用反射实例化每个类文件,并在所有实例上调用抽象方法,收集输出并保存到数据库。

但是,我现在必须将代码打包在 Jar 中,而 Java 似乎不允许在 jar 中搜索包中的所有类文件(因为它似乎会扰乱路径)。

我可以将所有实例添加到 GenericInstance 或其他内容的列表中,然后 Instantiator 就可以获取类列表。

但我希望其他人能够向该包添加一个类,仅此而已。

我应该遵循什么模式?有代码帮助吗?谢谢!

最佳答案

JDK中有一个内置的解决方案,就是ServiceLoader (Java 6+)。但是,它要求用户在 META-INF/services 中创建一个包含实现列表的文件。

如果您的基本接口(interface)是package.instances.GenericInstance,那么您的文件将被称为META-INF/services/package.instances.GenericInstance,其内容将为:

path.to.implementation1
path.to.implementation2

等等。根据您使用的构建系统,可能会自动为您生成此类文件(maven 有一个插件,请参阅 here )。

Java does not seem to allow searching for all class files in a package in a jar

是的,它可以(但是实现它的代码非常复杂——你必须创建一个URLClassLoader等)。

如果所有 jar 在运行时都在类路径中,一种解决方案是使用类似 reflections 的内容。 (奖励:取决于 Guava,因此您可以获得它的所有优点)它具有针对类等的高效过滤器,并且可以“反射(reflect)”除“系统”类加载器之外的类加载器;所以这也可以工作。

关于java - 可扩展地添加类以在 jar 中进行实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17114357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com