Re: [問題] ClassLoader的一個問題[已解決]
※ 引述《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
12/14 17:28, 1F
→
12/14 17:29, , 2F
12/14 17:29, 2F
→
12/14 17:30, , 3F
12/14 17:30, 3F
推
12/14 17:35, , 4F
12/14 17:35, 4F
推
12/14 17:37, , 5F
12/14 17:37, 5F
→
12/14 17:42, , 6F
12/14 17:42, 6F
→
12/14 17:43, , 7F
12/14 17:43, 7F
討論串 (同標題文章)