Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用java编写自己的插件加载程序?_Java_Plugins_Add On - Fatal编程技术网

如何用java编写自己的插件加载程序?

如何用java编写自己的插件加载程序?,java,plugins,add-on,Java,Plugins,Add On,如何在java程序中实现插件功能 我正在使用Java。我目前的项目是与通用电子硬件相关的,它有一个自定义的命令集 现在有了一个通用的GUI,通过它可以访问硬件。硬件在不同的环境中以不同的方式运行,即针对不同的客户端。现在的问题是GUI必须能够添加插件。插件意味着,它必须能够为拥有特权的客户提供特定的设施。从客户的角度来看,插件的添加是简单的,就像只需点击一个按钮来添加一个特定的工具 我之所以考虑插件,是因为只有在交付核心产品之后,才会引入越来越多的功能。您可以随时向应用程序添加jar或插件。你不

如何在java程序中实现插件功能

我正在使用Java。我目前的项目是与通用电子硬件相关的,它有一个自定义的命令集

现在有了一个通用的GUI,通过它可以访问硬件。硬件在不同的环境中以不同的方式运行,即针对不同的客户端。现在的问题是GUI必须能够添加插件。插件意味着,它必须能够为拥有特权的客户提供特定的设施。从客户的角度来看,插件的添加是简单的,就像只需点击一个按钮来添加一个特定的工具


我之所以考虑插件,是因为只有在交付核心产品之后,才会引入越来越多的功能。

您可以随时向应用程序添加jar或插件。你不需要做任何特殊的事情来实现这一点


如果您使用OGSi,您可以更轻松地管理它,支持同一jar的多个版本,并在应用程序运行时删除它们。我建议查看ApacheKaraf+iPOJO,您需要提供以下内容:

  • 创建一个API,您的插件可以使用它来更改/扩展程序的行为(这是最棘手的部分)
  • 定义插件的公共条目,例如,定义插件入口点或扩展点的插件特定属性文件(实现接口的插件类的类名)
  • 从您选择的位置动态加载插件,例如,从特定目录加载所有*.jar文件(查看
    URLClassLoader
API建议:

  • 与(抽象)类相比,更喜欢接口
  • 帮助用户快速查看可以实现哪些接口(例如,
    IAction
    ,注意前面的
    I
    )以及应用程序为插件使用提供的接口(例如,
    WindowManager

    • 在任何面向对象语言中实现插件的主要思想是定义一组插件和相关类必须实现的公共接口,然后通过反射加载和实例化它们

      您可以使用抽象工厂模式,以便插件所需的任何对象都可以实例化

      假设您的插件架构只有3个接口,每个插件必须提供实现这些接口的类,那么您的插件架构可以如下所示:

      public interface PluginInterfaceA {
      //Define API here
      };
      
      public interface PluginInterfaceB {
      // Define API here
      };
      
      public interface PluginInterfaceC {
      // Define API here
      };
      
      public interface PluginFactory {
      /**
       * Creates plugin A object.
       */
      PluginInterfaceA createPluginA();
      /**
       * Creates plugin B object.
       */
      PluginInterfaceB createPluginB();
      /**
       * Creates plugin C object.
       */
      PluginInterfaceC createPluginC();
      };
      
      然后让插件在XML文件或属性文件中定义插件工厂的类名:

      例如,假设您的插件定义:

      package com.my.plugin;
      
      public class PluginAImpl implements PluginInterfaceA {
      // Code for the class
      };
      
      public class PluginBImpl implements PluginInterfaceB {
      // Code for the class
      };
      
      public class PluginCImpl implements PluginInterfaceC {
      // Code for the class
      };
      
      public class PluginFactoryImpl implements PluginFactory {
      public PluginInterfaceA createPluginA() {
        return new PluginAImpl();
      }
      public PluginInterfaceB createPluginB() {
        return new PluginAImpl();
      }
      public PluginInterfaceC createPluginC() {
        return new PluginAImpl();
      }
      };
      
      然后在属性文件中定义 //插件的plugin.jar中提供的plugin.properties文件 plugin.factory.class=com.my.plugin.PluginFactoryImpl

      在你的应用程序中可以做什么

      Properties properties = new Properties();
      properties.load(this.getClass().getClassLoader().getResourceAsStream("plugin.properties"));
      
      String factoryClass = properties.get("plugin.factory.class");
      
      PluginFactory factory = Class.forName(factoryClass);
      
      PluginInterfaceA interfaceA = factory.createPluginA();
      PluginInterfaceB interfaceB = factory.createPluginB();
      PluginInterfaceC interfaceC = factory.createPluginC();
      
      //在这里,您可以随意调用创建的类

      谢谢
      Pablo

      JAR文件格式有,用于JavaSE的几个部分,包括JDBC驱动程序管理。只需定义一个服务接口,将带有实现的JAR文件放在类路径上,并加载实现。

      假设他想提供一个新的插件,它可以是
      pluginImpl
      的扩展,也可以是全新的。
      PluginFactoryImpl
      在不修改代码的情况下如何知道它?我的意思是那些接口是为一种类型的类提供的插件和是相关的,比如说一个图形编辑器想要支持新的形状,为此我需要为形状提供一个界面,为调色板中的工具提供一个界面,为UI上的按钮提供另一个界面。这些接口中的每一个都与插件相关,因此抽象工厂创建了相关类的组,然后我提供了创建这些类的实现的工厂。在我的示例中,PluginInterfaceA、PluginInterfaceB、PluginInterfaceC都是同一个插件的一部分,并且都完全符合该插件。这是我的观点。您需要修改每个新实现的工厂谢谢Pablo。。。我正在尝试…不,实际上你不必为插件的每个实现修改工厂,我实际上用一个定义良好的接口将我的应用程序编码为一组抽象,让我的应用程序的每个插件供应商开发一个实现,这样当另一个供应商想要添加插件时,我的代码不会改变,只需使用反射实例化供应商的工厂,并使用工厂的接口为插件的每个组件创建抽象。