之前研究所的畢業論文要使用設備廠商所提供的 Java SDK 來開發軟體,結果卻發現廠商的 Source code 和 library 只要搬出 default package 就不能用了,打電話給這間廠商他們也在上演一拖二裝傻三不接電話的戲碼,所以只好自己找解決辦法啦!
後來 Google 了一下發現很多人買了這間廠商的設備都遇到了這個問題,大家說的解決方法都是把其他自己的 code 也放到 default package 就好了,可是身為準備要畢業的研究生怎麼能這樣搞呢? 於是只好繼續尋找解法。首先有找到很早以前的資料說可以使用以下三種方法:
- import *;
- import *.*;
- import ClassInDefaultPackage;
試了之後卻無效,原來是 J2SE 1.4 開始,Java compile 便不再支持 import 未命名的 class。這個結果真是讓我從天堂掉到地獄呀...所幸再找了一下就發現了解決方法,就是使用 reflect 啦!以下就附上範例程式碼:
一. 在 default package 中的 class
- public class InDefaultPackage {
- public String test( int type ) {
- if ( type == 1 ) { return "Good!"; } // if
- else { return "Bad!"; } // else
- } // test()
- }
二. 在 default package 外的 class
- public class Test {
- public void test() {
- Class defaultPackage = Class.forName("InDefaultPackage");
- // 若不需要參數傳遞在第 11、12 行的第二個參數可填 null
- Class[] inputString = { Integer.class }; // 告訴 method 會傳什麼參數進去
- Method start = defaultPackage.getDeclaredMethod("test", inputString);
- Object[] transInputString = { new Integer(1) }; // 實際傳進 method 的值
- Object resultObj; // 作為接收回傳結果用
- resultObj = start.invoke(defaultPackage.newInstance(), transInputString);
- String output = (String) resultObj; // 將 object 轉換成預期的格式
- } // test()
- public static void main( String[] args ) {
- test();
- }
- }
沒有留言:
張貼留言