在 Java 中开发具有插件支持的应用程序

2024-04-06

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

然而,我当前的问题是如何加载打包在 Jars 中的插件。有没有“最好”的方法来做到这一点?

我当前想到的逻辑是获取每个插件并在其 Jar 中查找实现接口的类。但我不知道如何进行这样的查找。我认为这种逻辑可能不是一个好的逻辑,但我找不到关于这个特定主题的任何有用的信息。

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

应用程序的文件夹
|- Main_Application.jar
|- 插件
|- Plugin1.jar
|- Plugin2.jar
|- Steve's_plugin.jar

等等。

我期望应用程序能够在运行时加载文件夹内的所有插件。因此,在代码中,它只会知道插件的文件夹应该存在,并且该文件夹中应该有 Jars。

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

interface Plugin
{
    public void run();
}

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

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 内的任何包中,并且具有任何名称?

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


获取插件 jar 列表:

File[] jars = new File("Plugins").listFiles();

然后,使用来自这个关于从 JAR 文件加载所有类的答案 https://stackoverflow.com/questions/11016092/how-to-load-classes-at-runtime-from-a-folder-or-jar,但对每个文件运行一次jars谁的名字结尾为".jar"。在循环体的底部,之后

Class c = cl.loadClass(className);

继续

if (Plugin.class.isAssignableFrom(c)) {
    Plugin plugin = (Plugin) c.newInstance();
    // And then, do something with the plugin here
}

我同意 @Mifeet 对安全性的担忧 - 你可能想使用安全管理器 http://docs.oracle.com/javase/7/docs/api/java/lang/SecurityManager.html限制插件代码可以执行的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 中开发具有插件支持的应用程序 的相关文章

随机推荐

  • 动态加载模块的租户特定路由

    我正在使用 ASP NET MVC 开发应用程序框架 本质上 最终目标是能够登录管理界面 创建具有自定义设置的新租户 启用他们想要的模块 博客 购物篮等 工作完成 客户对新网站感到满意 我没有使用单独的应用程序 因为会有很多共享代码 这样维
  • 当文件没有扩展名时,如何告诉 RubyMine 文件类型?

    这看起来应该很容易 我正在创建一个 CLI 命令 gem 所以命令位于bin gem name其中没有 rb扩大 当我尝试在 RubyMine 中编辑该文件时 它没有为其提供语言模式 抱歉 不知道正确的术语 来使语法突出显示和 RubyMi
  • 如何使用现有的 Display 特征实现来实现 Serialize?

    我希望实施Serialize外部板条箱中类型的特征 但这是禁止的 我看了 serde 的远程导出 https serde rs remote derive html 但重写类型似乎需要做很多工作 就我而言 我希望序列化的所有类型都实现了Di
  • JavaScript 中的简单金融利率函数

    我正在寻找一个简单的 javascript 金融 RATE 函数 我找到了这个 但似乎太难理解了 我想简化这个功能 需要你的帮助 如果有人有最简单的功能 请回答 这是一个等效的 Excel RATE 函数 var rate function
  • 使用 .htaccess 阻止对文件和子目录的访问?

    我的目录中有近30个php文件 4个子目录 我想阻止用户直接查看一些 php 文件和子目录 例如http bhavani com hai php 我现在的htaccess file Enable Mod Rewrite this is on
  • Node.js HTTP 请求返回 2 个块(数据体)

    我试图通过 node js 中的 HTTP 请求获取 HTML 文件的源 我的问题是它返回数据两次 这是我的代码 var req http request options function res res setEncoding utf8
  • EUID 和 UID 之间的区别?

    EUID不等于UID 脚本中这两者在什么上下文中使用 我试图通过以下方式获取值echo UID is UID and EUID is EUID 但只有空间作为输出 我的机器运行 Ubuntu 12 04 LTS 在一些网站上看到 这通常用于
  • 在 Android 设备上使用 HTTP Post 将数据放入 Google App Engine Blobstore

    我正在尝试将数据发布到谷歌应用程序引擎上的Blob Store 此代码运行时不会抛出任何异常 但在blobstore端根本没有关于发布请求的日志 当我使用表单 尽管带有 mime 数据 发布时 服务器端的东西就可以工作 我已经允许我的 An
  • Laravel:错误 [PDOException]:无法在 MySQL 中找到驱动程序

    我正在尝试在我的中保存一个寄存器MySQL数据库使用Eloquent of Laravel 5 我编辑了数据库信息 env文件 本地化在我的系统根路径中 并在config database php维持 default gt mysql 和其
  • javascript排序稀疏数组保留索引

    对稀疏数组进行排序并使元素保持相同索引的最佳方法是什么 例如 a 0 3 a 1 2 a 2 6 a 7 4 a 8 5 我想排序后有 a 0 2 a 1 3 a 2 4 a 7 5 a 8 6 这是一种方法 它将定义的数组元素复制到新数组
  • 从 methodInfo.invoke 获取返回值

    我如何获得返回值 int from a methodInfo invoke 让我感到困难的是我使用字符串变量来调用该方法 检查下面的示例 if Convert ToBoolean getParameterFromXML issue k 1
  • 推送通知设备令牌?

    如何从我的 iPhone 设备获取设备令牌 此方法将在调试模式下在控制台中打印 deviceToken 如果您想查看设备令牌 也可以在 UIAlert 中看到 void application UIApplication applicati
  • Response.ContentType application/vnd.ms-excel xls 停止工作

    我对这个问题做了一些相当深入的搜索 但没有运气 在过去的几天里 从 HTML 到 XLS 的输出似乎已停止在我支持的许多旧版 阅读 经典 ASP 系统上运行 我已经能够在多个服务器 从 Office 2010 到 Office 2016 的
  • 将 contains_eager 与过滤器一起使用,但不过滤掉没有匹配子代的父代[重复]

    这个问题在这里已经有答案了 阅读 SQLAlchemy 文档 http docs sqlalchemy org en latest orm loading relationships html using contains eager to
  • SQL“float”数据类型在作为 XML 输出时会导致不需要的浮点结果

    您可以简单地尝试 table1 有一个类型为 float 的column1 代替 SELECT column1 from Table1 给出如表中所示的值 假设返回 15 1 但是 如果你尝试 Select column1 from Tab
  • GridSearchCV 历史最佳模型 CV

    我正在尝试将 GridSearchCV 与 KerasRegressor 一起使用进行超参数搜索 Keras model fit 函数本身允许使用历史对象查看 loss 和 val loss 变量 使用 GridSearchCV 时是否可以
  • Python:有什么方法可以声明常量参数吗?

    我有一个方法 def foo bar 有没有办法标记bar作为常数 例如 价值在bar不能改变 或 所指向的对象bar不能变 如果 bar 是不可变对象 则 bar 在函数执行期间不会改变 您还可以创建自己的常量对象 食谱在这里 http
  • 设置 元素的背景颜色(高度未设置为 100%)适用于整个视口

    我发现为整个设置背景颜色元素 高度未设置为 100 导致整个视口设置为该颜色 这个html 1 br 2 br 3
  • C++ 构建系统 - 使用什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑用 C 启动一个新项目 最初是在我自己的时间 并且我正在研究可用的构建系统 答案似乎是 很多
  • 在 Java 中开发具有插件支持的应用程序

    我一直在研究如何开发一个可以加载插件的应用程序 到目前为止 我已经看到这可以通过定义一个接口来完成 并让插件实现它 然而 我当前的问题是如何加载打包在 Jars 中的插件 有没有 最好 的方法来做到这一点 我当前想到的逻辑是获取每个插件并在