Re: [問題] 如何讓程式可以掛 Plugin (外掛)

看板java作者 (淺水中)時間15年前 (2008/10/09 07:50), 編輯推噓5(501)
留言6則, 5人參與, 最新討論串2/2 (看更多)
※ 引述《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
嘿,用 osgi container 就好了啊
10/09 11:48, 4F

10/09 14:12, , 5F
OSGi 規劃比較完整, 但是有自己的 manifest 欄位要填
10/09 14:12, 5F

10/09 23:56, , 6F
推!
10/09 23:56, 6F
文章代碼(AID): #18xKTMvE (java)
文章代碼(AID): #18xKTMvE (java)