程式者的胡言亂語

pageicon 星期一 八月 14, 2006

深入敵營的Java Part IV

借力使力的JVM


雖然邏輯上我們可以用VM觀點來看待IKVM.NET,但我個人認為轉換器觀點才是這個JVM巧妙的設計所在。因為倘若我們直接利用.NET上所提供的程式語言,重新打造一個可執行於.NETJVM,總是得付出開發一個完整VM的時間與精力,而且由於這個JVM是執行另一個VM之上,VM重重相疊,會帶來不少效能的耗損。但由於IKVM.NET主要的工作,在於進行Java.NET類別之間的轉換與對應(不論是動態或靜態),類別轉換後,即為執行於.NET平台上的.NET類別,而不是透過執行於.NET上的另一個VM執行。這麼一來,IKVM.NET的主要心力就是如何建立起這兩個世界間的對應,而不是建立另一個世界中的世界。


在我Java Two 2006的場次中有稍微說明IKVM.NET的類別載入動作,它是當我們應用動態模式時,IKVM.NET處理類別轉換的方式。不過,在本文中則將其省略,我會希望另行說明動態情況下,以及靜態模式下,IKVM.NET如何處理類別的轉換,我認為有一些有趣的手法值得介紹。


Java.NETInteroperability


有了ikvmc.exe,我們可以將Java類別轉換成為.NET類別,並可在.NET應用程式中直接加以呼叫,所以我們得到了.NET->Java的呼叫方向。有了ikvmstub.exe,我們更可為.NET類別產生相對應的Java stub類別,使得執行於IKVM.NET上的Java應用程式得以呼叫.NET類別,我們又得到Java->.NET的呼叫方向。綜合這兩個方向,我們既可在.NET程式中呼叫Java,也可以在Java程式中呼叫.NET。透過IKVM.NET我們可以得到Java.NET之間的interoperability-一種關係十分密切的interoperability


.NET程式中直接使用Java library






 [STAThread]


static void Main(string[] args)


{


        String index = "index";


        String field = "contents";


        //


        IndexReader reader = IndexReader.open(index);


        //


        Searcher searcher = new IndexSearcher(reader);


        Analyzer analyzer = new StandardAnalyzer();


        //


        QueryParser parser = new QueryParser(field, analyzer);


        Query query = parser.parse("reduplication");


        //


        Hits hits = searcher.search(query);


        //


        for(int i=0;i<hits.length();i++)


        {


                Document doc = hits.doc(i);


                String path = doc.get("path");


                Console.WriteLine(path);


        }


 


在這個例子中,我在C#程式中使用適才所轉換出來的lucene.dll,也就是Lucene的核心程式庫。你看,有趣的很,若非我刻意加上一行Console.WriteLine(path);,看起來還真的就像是個使用Lucene APIJava程式。這種情況,我把它稱為「.NET皮,Java骨」,雖然是借用.NET的皮,但骨子裡都是Java


Java程式呼叫.NETClasses


那麼該如何在Java程式中呼叫.NET中的class我們剛才利用javastub.exe產生System.dll中類別相對應的Java stub classes。我們來用用裡頭的幾個classes吧:






import cli.System.*;


import cli.System.Net.Sockets.TcpClient;


 


public class CallSystem


{


        public static void main(java.lang.String argv[])


        {


                TcpClient tcpClient = new TcpClient();


                DateTime dt = new DateTime();


                System.out.println(dt.ToShortDateString());


        }


 


TcpClientDateTime都是.NET核心程式庫中的類別,但透過IKVM.NET我們可以在Java程式中加以使用。諸君不妨想像,透過這種方式,Java應用程式可以善用許多Windows原生的功能,例如DirectXAPI。我們只要針對DirectXmanaged版本產生相對應的Java stub類別,接著便可以在Java的應用程式中呼叫。很有想像還有期待的空間吧?


Resources


IKVM.NET目前的參考資料不多,但作者的部落格提供很多開發時的想法與記錄,它的位址是在:http://weblog.ikvm.net/。而IKVM.NET的官方網站則是在:http://www.ikvm.net/

迴響:

發表迴響:
迴響功能已被關閉
把對母乳媽媽的感謝與支持傳出去

« 九月 2010
星期日星期一星期二星期三星期四星期五星期六
   
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  
       
今日

Search this blog

Links

Weblog menu

Today's referrers

Feeds