首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java支持插件开发应用程序

用Java支持插件开发应用程序
EN

Stack Overflow用户
提问于 2015-08-25 13:46:56
回答 2查看 1.2K关注 0票数 6

我一直在研究如何开发一个可以加载插件的应用程序。到目前为止,我已经看到这可以通过定义一个接口来实现,并让插件实现它。

然而,我目前的问题是如何加载插件时,他们被打包成罐子。有什么“最好”的方法吗?

我正在考虑的当前逻辑是获取每个插件,并在它们的Jar中查找实现接口的类。但我不知道怎么查。我认为这个逻辑可能不是一个好的逻辑,但是我找不到关于这个特定主题的任何有用的信息。

** Edit1 1:**添加更多信息:预期的插件将是包含在主应用程序Jar所在的子目录中的Jar文件,如下所示:

应用程序文件夹

( Main_Application.jar )

插件

分水岭

分水岭

分水岭- Steve's_plugin.jar

诸若此类。

我希望应用程序能够在运行时加载文件夹中的所有插件。因此,在代码中,它只会意识到插件的文件夹应该存在,并且在这样的文件夹中应该有Jars。

假设我有这样一个插件界面:

代码语言:javascript
复制
interface Plugin
{
    public void run();
}

插件将由实现此类接口的类标识,如下所示

代码语言:javascript
复制
class Plugin1 implements Plugin
{
    //attributes and other methods
    @override
    public void run()
    {
        //something happens here
    }
}

class Plugin2 implements Plugin
{
    //attributes and other methods
    @override
    public void run()
    {
        //something happens here
    }
}

应用程序应该只编译一次,并且能够在执行时加载添加到文件夹中的任何插件。为了使应用程序能够加载任何插件,我是否需要对Jar的内容建立规则,比如包名和实现接口的类?或者,实现插件接口的类可能在Jar中的任何包中,并且有任何名称?

这是更通用的方法,我想做什么与这样的插件。简而言之,我计划构建一个有选项卡的应用程序,每个插件都将提供每个选项卡的接口和功能。我尝试这样做是因为我希望能够单独维护每个选项卡,并且不希望重新编译整个应用程序,因为只有一个组件的更改根本不影响其他组件。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-26 17:08:30

获取插件罐列表:

代码语言:javascript
复制
File[] jars = new File("Plugins").listFiles();

然后,使用这个关于从JAR文件加载所有类的答案中的代码,但是对名称以".jar"结尾的jars中的每个文件运行一次。在循环体的底部

代码语言:javascript
复制
Class c = cl.loadClass(className);

继续

代码语言:javascript
复制
if (Plugin.class.isAssignableFrom(c)) {
    Plugin plugin = (Plugin) c.newInstance();
    // And then, do something with the plugin here
}

我同意@Mifeet对安全性的担忧--您可能需要使用SecurityManager来限制插件代码允许做的事情。

票数 4
EN

Stack Overflow用户

发布于 2020-11-18 12:38:47

很老的问题,但如果有人搜索..。在被接受的答案之外,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32205773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档