Re: [問題] ClassLoader的一個問題[已解決]

看板java作者 (偶爾想擺爛一下)時間16年前 (2009/12/14 17:00), 編輯推噓3(304)
留言7則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《del680202 (HANA)》之銘言: : : 今天在寫程式的時候 : : 我希望讓我程式有類似plug-in的功能 : : 所以我試著用URLClassLoader去實作這個功能 : : 首先我測試了一下 : : 先用eclipse開了一個project A : : 裡面一個interface : : interface CLI2 { : : public String say(); : } : : 而存在一個class 去實作他 : : public class CLTest implements CLI2 { : : static{ : System.out.println("Now!Class Load!"); : } : : @Override : public String say() { : System.out.println("Hello I am a happy boy!"); : return "Hello"; : } : : } : : 我把他輸出成tester.jar : : 之後我再開了一個project B : : 裡面是引用他的程式碼 : : URL url1 = new URL("file:c:/TC/"); : URLClassLoader urlClassLoader1 = : new URLClassLoader(new URL[] {url1} : ,Thread.currentThread().getContextClassLoader()); : : Class c2 = urlClassLoader1.loadClass("CLTest"); : : Object o=c2.newInstance(); : : CLI2 ci=(CLI2)o; : ci.say(); : : ----------------------------- : [略] : ////////////////////////////////////////////////////////////////////// : : 問題解決了,snowlike大的話給了我一點啟示 : : 我Project A原先兩隻程式都是放在default package : : 我把interface的部分放在另一個package org.cusano : : 而Project B同樣維護著一份interface,而我在同樣的創造一個package org.cusano在PB : : 之後PA的實作部分跟PB的引用部分都去import org.cusano.*; : : 這樣就解決了衝突的問題 : → sbrhsieh:在兩個地方維護必須相同的兩份碼是給自己找麻煩... 12/14 16:26 : → del680202:只維護相同的interface 主要是想針對interface就好 12/14 16:27 : → del680202:不過或許有更好的方法吧 暫時沒想到 12/14 16:30 不應該維護相同的 interface,而是 interface 只有一份。 我建議你的架構應該修改成: 1. CLI2 應該放進某個 package 內,並且是 public interface(否則會限制 plugin 實作的方式)。這個 xxx.CLI2 interface 在哪個 project 裡維護皆可(只要維護 一份碼)。 2. CLTest 打包成 tester.jar 時只要放進跟 CLTest 相關的部份,但不要有 CLI2.class 檔。(Plug-in jar 裡只有跟 implementation 相關的部份,而沒有 Plug-in implementation 所實作的 Plug-in interface) 3. 動態載入 CLTest plugin 的程式使用 URLClassLoader 去載入 tester.jar。 啟動這個程式時必須要讓 classpath 包含可以找到欲使用的 Plug-in interface 的 class files(for this case: xxx.CLI2) 的路徑。 URL url1 = new URL("file:c:/TC/tester.jar"); URLClassLoader pluginLoader = new URLClassLoader(new URL[] { url1 }); xxx.CLI2 plugin = (xxx.CLI2) pluginLoader.loadClass( "yyy.CLTest").newInstance(); System.out.println(plugin.say()); *目前這樣子的做法是把 plug-in implementation class name 寫死,嚴格來說 不是動態載入 plug-in。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.129.90 ※ 編輯: sbrhsieh 來自: 218.173.129.90 (12/14 17:14)

12/14 17:28, , 1F
原來如此 受益良多了 因為用eclipse時拆成兩個project
12/14 17:28, 1F

12/14 17:29, , 2F
所以架構上變得粗糙了 應該弄在同一個project就好
12/14 17:29, 2F

12/14 17:30, , 3F
哪邊讓你覺得應該弄在同一個 project?
12/14 17:30, 3F

12/14 17:35, , 4F
後來測了一下 主要是我沒有同個interface可以參考
12/14 17:35, 4F

12/14 17:37, , 5F
程式寫起來不方便 所以當時才會各自維護interface
12/14 17:37, 5F

12/14 17:42, , 6F
Eclipse 內各 project 是可以互相參考的。
12/14 17:42, 6F

12/14 17:43, , 7F
這功能就沒研究過了 晚點來試試看
12/14 17:43, 7F
文章代碼(AID): #1B9VwpOA (java)
文章代碼(AID): #1B9VwpOA (java)