2014年3月5日 星期三

Java 呼叫 default package 中的 Class 及 function

之前研究所的畢業論文要使用設備廠商所提供的 Java SDK 來開發軟體,結果卻發現廠商的 Source code 和 library 只要搬出 default package 就不能用了,打電話給這間廠商他們也在上演一拖二裝傻三不接電話的戲碼,所以只好自己找解決辦法啦!

後來 Google 了一下發現很多人買了這間廠商的設備都遇到了這個問題,大家說的解決方法都是把其他自己的 code 也放到 default package 就好了,可是身為準備要畢業的研究生怎麼能這樣搞呢? 於是只好繼續尋找解法。首先有找到很早以前的資料說可以使用以下三種方法:
  1. import *; 
  2. import *.*; 
  3. import ClassInDefaultPackage;
試了之後卻無效,原來是 J2SE 1.4 開始,Java compile 便不再支持 import 未命名的 class這個結果真是讓我從天堂掉到地獄呀...所幸再找了一下就發現了解決方法,就是使用 reflect 啦!以下就附上範例程式碼:


一. 在 default package 中的 class

  1. public class InDefaultPackage {

  2.     public String test( int type ) {
  3.         if ( type == 1 ) { return "Good!"; }  //  if
  4.         else { return "Bad!"; }  //  else
  5.     }  //  test()

  6. }


二. 在 default package 外的 class

  1. public class Test {

  2.     public void test() {
  3.         Class defaultPackage = Class.forName("InDefaultPackage");
  4.         
  5.         //  若不需要參數傳遞在第 11、12 行的第二個參數可填 null
  6.         Class[] inputString = { Integer.class };  //  告訴 method 會傳什麼參數進去
  7.         Method start = defaultPackage.getDeclaredMethod("test", inputString);

  8.         Object[] transInputString = { new Integer(1) };  //  實際傳進 method 的值
  9.         Object resultObj;  //  作為接收回傳結果用
  10.         resultObj = start.invoke(defaultPackage.newInstance(), transInputString);
  11.         
  12.         String output = (String) resultObj;  //  將 object 轉換成預期的格式
  13.     }  //  test()

  14.     public static void main( String[] args ) {
  15.         test();
  16.     }

  17. }

沒有留言:

張貼留言