Re: [問題] 如何讓程式可以掛 Plugin (外掛)
※ 引述《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)
→
10/09 11:11, , 1F
10/09 11:11, 1F
推
10/09 11:13, , 2F
10/09 11:13, 2F
推
10/09 11:20, , 3F
10/09 11:20, 3F
推
10/09 11:48, , 4F
10/09 11:48, 4F
推
10/09 14:12, , 5F
10/09 14:12, 5F
推
10/09 23:56, , 6F
10/09 23:56, 6F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):