java 板


LINE

※ 引述《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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Soft_Job站内搜寻

TOP