本節將介紹ActiveX控件、Automation服務器或者其他任何符合COM規范的服務器的開發過程。下面這個例子實現了一個簡單的Automation服務器,它能執行整數加法。我們用setAddend()方法設置addend的值。每次調用sum()方法的時候,addend就會添加到當前result裡。我們用getResult()獲得result值,並用clear()重新設置值。用於實現這一行為的Java類是非常簡單的:
public class Adder { private int addend; private int result; public void setAddend(int a) { addend = a; } public int getAddend() { return addend; } public int getResult() { return result; } public void sum() { result += addend; } public void clear() { result = 0; addend = 0; } }
為了將這個Java類作為一個COM對象使用,我們將Javareg工具應用於編譯好的Adder.class文件。這個工具提供了一系列選項;在這種情況下,我們指定Java類文件名("Adder"),想為這個服務器在注冊表裡置入的ProgID("JavaAdder.Adder.1"),以及想為即將生成的類型庫指定的名字("JavaAdder.tlb")。由於尚未給出CLSID,所以Javareg會自動生成一個。若我們再次對同樣的服務器調用Javareg,就會直接使用現成的CLSID。
javareg /register
/class:Adder /progid:JavaAdder.Adder.1
/typelib:JavaAdder.tlb
Javareg也會將新服務器注冊到Windows注冊表。此時,我們必須記住將Adder.class復制到Windows\Java\trustlib目錄。考慮到安全方面的原因(特別是涉及程序片調用COM服務的問題),只有在COM服務器已安裝到trustlib目錄的前提下,這些服務器才會被激活。
現在,我們已在自己的系統中安裝了一個新的Automation服務器。為進行測試,我們需要一個Automation控制器,而Automation控制器就是Visual Basic(VB)。在下面,大家會看到幾行VB代碼。按照VB的格式,我設置了一個文本框,用它從用戶那裡接收要相加的值。並用一個標簽顯示結果,用兩個下推按鈕分別調用sum()和clear()方法。最開始,我們聲明了一個名為Adder的對象變量。在Form_Load子例程中(在窗體首次顯示時載入),會調用Adder自動服務器的一個新實例,並對窗體的文本字段進行初始化。一旦用戶按下“Sum”或者“Clear”按鈕,就會調用服務器中對應的方法。
Dim Adder As Object Private Sub Form_Load() Set Adder = CreateObject("JavaAdder.Adder.1") Addend.Text = Adder.getAddend Result.Caption = Adder.getResult End Sub Private Sub SumBtn_Click() Adder.setAddend (Addend.Text) Adder.Sum Result.Caption = Adder.getResult End Sub Private Sub ClearBtn_Click() Adder.Clear Addend.Text = Adder.getAddend Result.Caption = Adder.getResult End Sub
注意,這段代碼根本不知道服務器是用Java實現的。
運行這個程序並調用了CreateObject()函數以後,就會在Windows注冊表裡搜索指定的ProgID。在與ProgID有關的信息中,最重要的是Java類文件的名字。作為一個響應,會啟動Java虛擬機,而且在JVM內部調用Java對象的實例。從那個時候開始,JVM就會自動接管客戶和服務器代碼之間的交流。