作者sbrhsieh (偶尔想摆烂一下)
看板java
标题Re: [问题] ClassLoader的一个问题[已解决]
时间Mon Dec 14 17:00:31 2009
※ 引述《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)
1F:推 del680202:原来如此 受益良多了 因为用eclipse时拆成两个project 12/14 17:28
2F:→ del680202:所以架构上变得粗糙了 应该弄在同一个project就好 12/14 17:29
3F:→ sbrhsieh:哪边让你觉得应该弄在同一个 project? 12/14 17:30
4F:推 del680202:後来测了一下 主要是我没有同个interface可以参考 12/14 17:35
5F:推 del680202:程式写起来不方便 所以当时才会各自维护interface 12/14 17:37
6F:→ sbrhsieh:Eclipse 内各 project 是可以互相参考的。 12/14 17:42
7F:→ del680202:这功能就没研究过了 晚点来试试看 12/14 17:43