如何在我的java程序中实现插件设施?如何在java中编写自己的插件加载器?
我正在使用Java。我目前的项目与通用电子硬件有关,它们具有自定义命令集。
现在有通过它可以访问硬件的通用GUI。硬件在不同的环境中以不同的方式运行,即针对不同的客户端。现在问题是GUI必须能够添加插件。插件意味着,它必须能够为有特权的客户提供特定的设施。从客户角度来看,插件的添加很简单,就像点击一个按钮来添加特定设施。
我之所以想到的插件是,越来越多的设备将只提供核心产品之后推出。
如何在我的java程序中实现插件设施?如何在java中编写自己的插件加载器?
我正在使用Java。我目前的项目与通用电子硬件有关,它们具有自定义命令集。
现在有通过它可以访问硬件的通用GUI。硬件在不同的环境中以不同的方式运行,即针对不同的客户端。现在问题是GUI必须能够添加插件。插件意味着,它必须能够为有特权的客户提供特定的设施。从客户角度来看,插件的添加很简单,就像点击一个按钮来添加特定设施。
我之所以想到的插件是,越来越多的设备将只提供核心产品之后推出。
您可以随时罐或插件添加到应用程序。你不必做任何特殊的事情来实现这一点。
如果使用OGSI您可以管理这更容易,支持同一个jar的多个版本和应用程序运行时将其删除。我建议在看的Apache Karaf + iPOJO
您需要提供以下几件事:
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中提供的File 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();
//这里调用创建的类,只要你喜欢。
感谢 巴勃罗
JAR文件格式有its own little system for managing plugins,用于对Java SE的几个部分,包括JDBC驱动程序管理。只需定义一个服务接口,将带有实现的JAR文件放在类路径中,并使用ServiceLoader.load
加载实现。
假设他想提供一个新的插件,它可以是'PluginAImpl'的扩展或全新的。PluginFactoryImpl'如何在不修改代码的情况下知道它? – Cratylus
我的意思是这些接口是针对一类插件的类而且是相关的,比如说图形编辑器想要支持新的形状,为此我需要为形状提供一个接口,为工具提供接口在UI上调整另一个按钮。每个接口都与插件有关,所以抽象工厂创建相关类的组,然后我提供我的工厂来创建我的实现。在我的例子PluginInterfaceA,PluginInterfaceB,PluginInterfaceC是同一个插件的一部分,并且都完全符合插件。 –
这是我的观点。您需要修改每个新实现的工厂 – Cratylus