在没有父类主体的情况下在 Java 中编译插件代码



我正在尝试向我的应用程序添加插件系统。我有一个插件必须扩展的抽象类。这个类提供了有用的方法,所以我真的需要它。问题是这些插件可以由任何人编写,所以我假设他们需要抽象类代码才能编译他们的代码。

我不想使创建插件的过程复杂化。有没有办法在不知道抽象类体(仅其方法)的情况下编译代码?

提前谢谢。

有没有办法在不知道抽象类体(仅其方法)的情况下编译代码?

不。为了编译声明为

class A extends B
您必须在源

路径中以源格式B,或在类路径中以.class格式进行。

(如果只知道方法就足以编写插件,那么听起来更像是你追求一个接口而不是抽象类。

我不想使创建插件的过程复杂化。

提供B的已编译.class文件并不复杂,可能是此方案中的最佳做法。

实际上,通过包含相关类和接口的.jar文件获得API可能是标准。

需要明确的是:

  1. 选择与插件开发相关的类,编译它们,然后将它们放入,比如pluginapi.jar
  2. 分发.jar并告诉插件开发人员他们的插件应该编译,前提是pluginapi.jar
  3. 要求插件开发人员为您提供plugin.jar(不一定包括插件类)
  4. 在应用程序中,确保插件 API 类存在,例如,将它们包含在类路径中。
  5. 加载插件类。

你可以要求你的插件作者为你提供一些带有一些指定方法的类,并使用反射调用这些类。这意味着他们可以编写一个插件,无需访问您的任何代码即可编译。

但这也会严重限制他们的可能性:如果他们无法调用插件,插件应该如何与您的系统交互?由于提供它的唯一合理方法是使某些类(或接口)可访问,因此您也可以提供它们需要实现/扩展的接口(或抽象类)。

您可以将该接口(以及插件可见的所有接口/类)放在单独的.jar文件中。这样,他们只需要该jar文件即可编译插件。

你可以提供一个包含所有必需的java文件的jar文件。但请记住,一旦你发布了 api,你应该非常小心地改变它。

或者,

你可以通过不强迫用户扩展类或实现接口来绕过,而是让他们提供一个具有特定签名的函数 - 然后你可以通过反射调用它。在这种情况下,他们不需要您的任何东西,但是,如果他们弄错了功能,显然您将无法调用该插件。

在这些情况下,Java脚本可能非常有用。用Groovy编写插件,代码可以很容易地(向下)加载并在框架中执行,就像这样 http://groovy.codehaus.org/Embedding+Groovy

相关内容

  • 没有找到相关文章

最新更新