程式者的胡言亂語
深入敵營的Java Part IV
借力使力的JVM
雖然邏輯上我們可以用VM觀點來看待IKVM.NET,但我個人認為轉換器觀點才是這個JVM巧妙的設計所在。因為倘若我們直接利用.NET上所提供的程式語言,重新打造一個可執行於.NET的JVM,總是得付出開發一個完整VM的時間與精力,而且由於這個JVM是執行另一個VM之上,VM重重相疊,會帶來不少效能的耗損。但由於IKVM.NET主要的工作,在於進行Java與.NET類別之間的轉換與對應(不論是動態或靜態),類別轉換後,即為執行於.NET平台上的.NET類別,而不是透過執行於.NET上的另一個VM執行。這麼一來,IKVM.NET的主要心力就是如何建立起這兩個世界間的對應,而不是建立另一個世界中的世界。
在我Java Two 2006的場次中有稍微說明IKVM.NET的類別載入動作,它是當我們應用動態模式時,IKVM.NET處理類別轉換的方式。不過,在本文中則將其省略,我會希望另行說明動態情況下,以及靜態模式下,IKVM.NET如何處理類別的轉換,我認為有一些有趣的手法值得介紹。
Java與.NET的Interoperability
有了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 { 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 API的Java程式。這種情況,我把它稱為「.NET皮,Java骨」,雖然是借用.NET的皮,但骨子裡都是Java。
Java程式呼叫.NET的Classes
那麼,該如何在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()); } |
TcpClient、DateTime都是.NET核心程式庫中的類別,但透過IKVM.NET我們可以在Java程式中加以使用。諸君不妨想像,透過這種方式,Java應用程式可以善用許多Windows原生的功能,例如DirectX的API。我們只要針對DirectX的managed版本產生相對應的Java stub類別,接著便可以在Java的應用程式中呼叫。很有想像還有期待的空間吧?
Resources
IKVM.NET目前的參考資料不多,但作者的部落格提供很多開發時的想法與記錄,它的位址是在:http://weblog.ikvm.net/。而IKVM.NET的官方網站則是在:http://www.ikvm.net/。
Posted at 10:13下午 八月 14, 2006 by Chien-Hsing Wang in Java |
星期一 八月 14, 2006
