作者calais007 (浅水中)
看板java
标题Re: [问题] 如何让程式可以挂 Plugin (外挂)
时间Thu Oct 9 07:50:45 2008
※ 引述《VElysian (家瑀 致中和)》之铭言:
: 我想让自己的程式变成可以外挂 Plugin,请问要怎麽做呢??
: 像 Notepad++ 可以额外下载自己需要的外挂,
: 丢到安装资料夹後,打开 Notepad++ 可以汇入下载的外挂。
: (或者在开启时自动侦测资料夹有没有新的外挂)
: ───────────────────────────────────────
: 另外,有办法写出专门用来开发外挂的 SDK 吗??
: 例如 FireFox extention 或 Yahoo widget ,
: 有的使用现有的语言,有的用自己的语言。
: 我知道 Lua 好像可以内嵌到程式中(因为看到 PTT2 有 BBSLua)。
: ───────────────────────────────────────
: 非常非常感激您。 ^__^
要做run time载入的plugin不难
首先你要先规画好
我写个几个简单的sample给你看好了
首先先定义好所有plugin需要的method
public interface plugin{
public void initPlugin(args....)throws xxxException
public void startPlugin()thows xxxException
public String getName()
public void setName()
public void destoryPlugin()
.....
}
然後实作你的plugin
public class MyPlugin implements plugin{
.......
}
接下来实作Java Class file Loader
这里有两个方法可以做
一个是直接改写java.lang.ClassLoader
另一个是直接用URLClassLoader
我用URLClassLoader写个简单的sample给你看好了
public class PluginClassLoader{
URLClassLoader classloader=null;
//从一个档案载入成runtime时可以用的class
public Class loadPlugin(String name)throws ClassNotFoundException
{
File classFile = null;
Class clas = null;
//注意,在此是假设plugin只有一个class,如果plugin包含许多class和其他的档案
//要全部设在url这个array上,为了简化,所以不写了
URL[] url = new URL[1];
url[0] = classFile.toURL();
classloader = URLClassLoader.newInstace(url);
//这里是指class的path和name但用paht不是用"/"是用"."表示且要与package配合喔
//例如你的plugin是放在plugin/ main class叫 MyPlugin
//则那个string参数就是"plugin.MyPlugin"
clas = classloader.loadClass("plugin.MyPlugin");
//接下来的code则是判断plugin是否合法并初使化它
//例如
if(clas instanceof Plugin)
{
Plugin plugin = (Plugin)clas;
plugin.initalPlugin(args);
plugin.startPlugin();
}
else{
//show错误的plugin讯息吧
}
}
}
要变成run time只要写一个thread并用一个list来维护plugin
每一段时间检查特定的目录下的档案
并用PluginClassLoader将.class载入成Plugin
接着再判断list上有没有存在相同的plugin
有的话就呼叫你实作的destroy method来销毁这个instance
这个作法一定可以的
因为我作过:P
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.169.44.11
※ 编辑: calais007 来自: 118.169.44.11 (10/09 07:54)
1F:→ costbook:推~~~ 10/09 11:11
2F:推 costbook:补推 10/09 11:13
3F:推 TonyQ:推! 10/09 11:20
4F:推 qrtt1:嘿,用 osgi container 就好了啊 10/09 11:48
5F:推 kene:OSGi 规划比较完整, 但是有自己的 manifest 栏位要填 10/09 14:12
6F:推 howardwang:推! 10/09 23:56