java - 在 Java 中处理插件有什么好的模式吗?

标签 java plugins

这个问题有点受到 previous question 的启发。我问过了

我编写的大部分代码都与 API 相关,API 本质上必须易于扩展。我和我的团队的其他成员正在努力解决他如何处理插件的一个常见问题,即可以扩展我们自己的接口(interface)的类,并且在最终实现中应该感觉像是解决方案的原子部分。我特别考虑以下类型的用例(使用汽车类比)

接口(interface):

Car

提供的实现:

Ford
Audi

第 3 方实现:

Toyota

我们通常需要的是 CarDealer 类了解 Car 的所有现有实现,而无需强制第 3 方显式声明 Car 在配置文件中。我一直在考虑的一个想法是让 Car 的实现在 CarDealer 中注册自己,但这打开了一个新的蠕虫 jar 头,因为 Toyota (或任何其他实现)在被显式引用之前不会被初始化,这是一个 catch22。注释 Car 的实现,然后遍历代码并使用相关注释初始化任何类也是一种方法,但我担心这可能会占用大量资源。

我想我们不可能是第一个解决这个问题的人,那么有没有已知的设计模式可以解决这个问题?

最佳答案

看看 java.util.ServiceLoader。本质上,您创建了一个接口(interface),然后该服务的所有实现者都可以包含一个文件/META-INF/services/ 列出他们 jar 中的所有实现。

然后可以使用 ServiceLoader 加载在类路径中发现的所有实现(例如 JDBC 4.0 要求驱动程序也使用它来摆脱使用 Class.forName(...) 来加载驱动程序)。

关于java - 在 Java 中处理插件有什么好的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7929281/

相关文章:

java - 如何通过 GET/POST 安全地发送密码?

java - JIT 优化器是否优化乘法?

javascript - 使用附加功能/覆盖功能扩展 jQuery 插件

java - UseConcMarkSweepGC 已弃用,它的替代品是什么?

java - 我如何发现给定日期的季度?

java - 如何处理 example.com/request 类型的任何请求?

plugins - Android Studio 创建新项目需要这么长时间是否正常?

linux - 跨平台安装约定和最佳实践

plugins - 在 CRM 2011 中升级自定义工作流事件程序集时出错

java - habarta typescript 插件无法加载类