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