Java クラスの中のフィールドへのアクセス

RPG がサポートするのは Java™ メソッドの 呼び出しのみです。Java フィールドへの アクセスはサポートしません。通常、フィールドは「get」メソッドおよび「set」メソッドを通じて アクセスされますが、JNI 呼び出しを使用してフィールドにアクセスすることも可能です。ここでは、 Java クラスまたはオブジェクトのフィールドへのアクセスに必要な JNI 呼び出しの例を示します。

注: この例は JNI を使用する例となることを目的としたものです。 「get」メソッドや「set」メソッドを使用するよりも、フィールドに直接にアクセスすることを推奨する、という意味ではありません。
図 1. Java クラスおよびオブジェクトのフィールドにアクセスするための JNI の使用
 *------------------------------------------------------------------
 * この例は、クラスまたはオブジェクトのフィールドにアクセスするための
 * JNI の使用法を示しています。
 *
 * このプログラムは Rectangle オブジェクトを作成し、JNI 呼び出しを
 * 使用して、width 変数と height 変数に直接アクセスします。
 *
 * この特定の例においては、getWidth()、getHeight、
 * setWidth() および setHeight() メソッドを使用して
 * これらのフィールドにアクセスし、JNI 呼び出しの使用は避けます。
 *------------------------------------------------------------------
H THREAD(*SERIALIZE)
 /DEFINE JNI_COPY_FIELD_FUNCTIONS
 /COPY JNI
 /COPY JAVAUTIL
 *------------------------------------------------------------------
 * JAVA クラスおよびメソッド
 *------------------------------------------------------------------
D Rectangle       C                   'java.awt.Rectangle'
D NewRectangle    PR              O   EXTPROC(*JAVA
D                                           : Rectangle
D                                           : *CONSTRUCTOR)
D     x                         10I 0 VALUE
D     y                         10I 0 VALUE
D     width                     10I 0 VALUE
D     height                    10I 0 VALUE
 *------------------------------------------------------------------
 * JAVA 名の ASCII 表記を用いた定数
 *------------------------------------------------------------------
 * これらの値を判別する 1 つの方法は、文字値を UCS-2 に変換するために
 * %UCS2 を使用して、結果をデバッガーの中で
 * 16 進で表示するという方法です。
 *
 * ASCII 値は UCS-2 文字に 2 バイトおきに入っています。
 *
 *     例えば、%UCS2('abc') = X'006100620063'
 *                                     --  --  --
 *     'abc' の ASCII 表記は X'616263' です。
 *------------------------------------------------------------------
D ASCII_I         C                   x'49'
D ASCII_x         C                   x'78'
D ASCII_y         C                   x'79'
D ASCII_width     C                   X'7769647468'
D ASCII_height    C                   X'686569676874'  
 * JNI はスラッシュを区切り文字として使用するため、これは
 *「java/awt/Rectangle」であって「java.awt.Rectangle」ではないことに注意。
D ASCII_Rectangle...
D                 C                   X'6A6176612F6177742F52656-
D                                     374616E676C65'
 *------------------------------------------------------------------
 * 取り消し処理
 *------------------------------------------------------------------
D EnableCanHdlr   PR                  EXTPROC('CEERTX')
D   Handler                       *   CONST PROCPTR
D   CommArea                      *   CONST OPTIONS(*OMIT)
D   Feedback                    12A   OPTIONS(*OMIT)
D CanHdlr         PR
D   CommArea                      *   CONST
 *------------------------------------------------------------------
 * 変数およびプロシージャー
 *------------------------------------------------------------------
D rect            s               O   CLASS(*JAVA : Rectangle)
D x               S             10I 0
D y               S             10I 0
D rectClass       S                   LIKE(jclass)
D fieldId         S                   LIKE(jfieldID)
D msg             S             52A
D Cleanup         PR
 *------------------------------------------------------------------
 * 取り消し処理プログラムを使用可能にし終結処理が完了したことを確認
 *------------------------------------------------------------------
C                   CALLP     EnableCanHdlr (%PADDR(CanHdlr)
C                                          : *OMIT : *OMIT)
 *------------------------------------------------------------------
 * x,y 座標 (5, 15) を使用して、幅 100 で高さが 200 の
 * 新しい Rectangle を作成します。
 *------------------------------------------------------------------
C                   EVAL      rect = NewRectangle (5 : 15 : 100 : 200)
 *------------------------------------------------------------------
 * Rectangle のフィールドにアクセスするための JNI 機能を呼び出す準備
 *------------------------------------------------------------------
C                   EVAL      JNIEnv_P = getJniEnv ()
C                   EVAL      rectClass = FindClass (JNIEnv_P
C                                                  : ASCII_Rectangle)
 *------------------------------------------------------------------
 * Rectangle の幅および高さを検索するための JNI 機能の呼び出し
 *------------------------------------------------------------------
C                   eval      fieldId = GetFieldID (JNIEnv_P
C                                                 : rectClass
C                                                 : ASCII_width
C                                                 : ASCII_I)
C                   eval      width = GetIntField (JNIEnv_P
C                                                 : rect
C                                                 : fieldId)
C                   eval      fieldId = GetFieldID (JNIEnv_P
C                                                 : rectClass
C                                                 : ASCII_height
C                                                 : ASCII_I)
C                   eval      height = GetIntField (JNIEnv_P
C                                                  : rect
C                                                  : fieldId)
C                   eval      msg = 'The rectangle has dimensions ('
C                                 + %trim(%editc(width : '1'))
C                                 + ', '
C                                 + %trim(%editc(height : '1'))
C                                 + ')'
C     msg           dsply
 *------------------------------------------------------------------
 * Cleanup プロシージャーを呼び出します。
 *------------------------------------------------------------------
C                   callp     Cleanup()
C                   eval      *INLR = '1'
 *------------------------------------------------------------------
 * Cleanup。* - 必要であればオブジェクトを解放します。
 *------------------------------------------------------------------
P Cleanup         B
C                   if        rect <> *NULL and
C                             JNIEnv_P <> *NULL
C                   callp     DeleteLocalRef(JNIEnv_P : rect)
C                   endif
C                   eval      rect = *NULL
C                   eval      JNIEnv_P = *NULL
P Cleanup         E
 *------------------------------------------------------------------
 * 取り消し処理プログラム。終結処理が完了したことを確認。
 *------------------------------------------------------------------
P CanHdlr         B
D CanHdlr         PI
D   CommArea                      *   CONST
C                   callp     Cleanup()
P CanHdlr         E