2011-09-28 39 views
1

如何在我的java程序中实现插件设施?如何在java中编写自己的插件加载器?

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

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

我之所以想到的插件是,越来越多的设备将只提供核心产品之后推出。

回答

2

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

如果使用OGSI您可以管理这更容易,支持同一个jar的多个版本和应用程序运行时将其删除。我建议在看的Apache Karaf + iPOJO

8

您需要提供以下几件事:

  • 创造出你的插件可以用它来改变API /延长你的程序的行为(恕我直言,这是最棘手部分)
  • 定义一个共同进入该插件,如插件特有的属性文件中定义插件类的插件中(类名的入口点或扩展点实现一个接口)
  • 从您选择的位置动态加载插件,例如,来自特定目录的所有* .jar文件(查看在URLClassLoader

API建议:

  • 喜欢接口上(抽象)类
  • 这可能是帮助用户快速查看哪些接口她可以实现有用的(例如IAction,注意前导I)和由您的应用程序插件的使用提供(例如WindowManager
2

落后于任何面向对象语言实现插件的主要思想,是定义一组通用界面,插件和相关的类必须实现,然后加载并通过反射实例化它们...

您可以使用抽象工厂模式,这样的插件所需的任何对象可以被实例化...

比方说,你的插件架构只有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(); 

//这里调用创建的类,只要你喜欢。

感谢 巴勃罗

+0

假设他想提供一个新的插件,它可以是'PluginAImpl'的扩展或全新的。PluginFactoryImpl'如何在不修改代码的情况下知道它? – Cratylus

+0

我的意思是这些接口是针对一类插件的类而且是相关的,比如说图形编辑器想要支持新的形状,为此我需要为形状提供一个接口,为工具提供接口在UI上调整另一个按钮。每个接口都与插件有关,所以抽象工厂创建相关类的组,然后我提供我的工厂来创建我的实现。在我的例子PluginInterfaceA,PluginInterfaceB,PluginInterfaceC是同一个插件的一部分,并且都完全符合插件。 –

+0

这是我的观点。您需要修改每个新实现的工厂 – Cratylus

相关问题