我正在尝试向我的应用程序添加插件系统。我有一个插件必须扩展的抽象类。这个类提供了有用的方法,所以我真的需要它。问题是这些插件可以由任何人编写,所以我假设他们需要抽象类代码才能编译他们的代码。
我不想使创建插件的过程复杂化。有没有办法在不知道抽象类体(仅其方法)的情况下编译代码?
提前谢谢。
有没有办法在不知道抽象类体(仅其方法)的情况下编译代码?
不。为了编译声明为
class A extends B
您必须在源路径中以源格式B
,或在类路径中以.class格式进行。
(如果只知道方法就足以编写插件,那么听起来更像是你追求一个接口而不是抽象类。
我不想使创建插件的过程复杂化。
提供B
的已编译.class文件并不复杂,可能是此方案中的最佳做法。
实际上,通过包含相关类和接口的.jar文件获得API可能是标准。
需要明确的是:
- 选择与插件开发相关的类,编译它们,然后将它们放入,比如
pluginapi.jar
- 分发.jar并告诉插件开发人员他们的插件应该编译,前提是
pluginapi.jar
- 要求插件开发人员为您提供
plugin.jar
(不一定包括插件类) - 在应用程序中,确保插件 API 类存在,例如,将它们包含在类路径中。
- 加载插件类。
你可以要求你的插件作者为你提供一些带有一些指定方法的类,并使用反射调用这些类。这意味着他们可以编写一个插件,无需访问您的任何代码即可编译。
但这也会严重限制他们的可能性:如果他们无法调用插件,插件应该如何与您的系统交互?由于提供它的唯一合理方法是使某些类(或接口)可访问,因此您也可以提供它们需要实现/扩展的接口(或抽象类)。
您可以将该接口(以及插件可见的所有接口/类)放在单独的.jar文件中。这样,他们只需要该jar文件即可编译插件。
你可以提供一个包含所有必需的java文件的jar文件。但请记住,一旦你发布了 api,你应该非常小心地改变它。
你可以通过不强迫用户扩展类或实现接口来绕过,而是让他们提供一个具有特定签名的函数 - 然后你可以通过反射调用它。在这种情况下,他们不需要您的任何东西,但是,如果他们弄错了功能,显然您将无法调用该插件。
在这些情况下,Java脚本可能非常有用。用Groovy编写插件,代码可以很容易地(向下)加载并在框架中执行,就像这样 http://groovy.codehaus.org/Embedding+Groovy