INVOKE ステートメントは、COBOL または Java クラスのオブジェクト・インスタンスを生成したり、COBOL または Java クラスで定義されたメソッドを呼び出すことができます。
フォーマット >>-INVOKE--+-ID-1-------+--+-リテラル-1-+-----------------------> +-クラス名-1-+ +-ID-2-------+ +-SELF-------+ '-NEW--------' '-SUPER------' >--+-------------------------------------------------------+----> | .--------------------------------------------. | | | .-------------------------. | | | V V | | | '-USING----+----+--VALUE----+-+-----------+--ID-3-+-+-+-' '-BY-' | '-LENGTH OF-' | '-リテラル-2----------' >--+-----------------+------------------------------------------> '-RETURNING--ID-4-' >--+-----------------------------------------+------------------> '-+----+--EXCEPTION---命令ステートメント-1-' '-ON-' >--+----------------------------------------------+-------------> '-NOT--+----+--EXCEPTION---命令ステートメント-2-' '-ON-' >--+------------+---------------------------------------------->< '-END-INVOKE-'
ID-1 を指定するときは、リテラル-1 または ID-2 を指定し、呼び出すメソッドの名前を識別する必要があります。
以下の場合、INVOKE ステートメントの結果は未定義です。
クラス名-1 を NEW と共に指定すると、INVOKE ステートメントにより、クラス名-1 クラスのインスタンスである新しいオブジェクトが生成されます。
クラス名-1 は、INVOKE ステートメントが入っているクラスまたはプログラムの 構成セクションの REPOSITORY 段落に指定する必要があります。
リテラル-1 は英数字リテラルまたは国別リテラルでなければなりません。
リテラル-1 は、大文字小文字を区別して解釈されます。 INVOKE ステートメントの USING 句に指定したメソッド名、引数の数、および引数のデータ型は、 オブジェクトでサポートされた一致するシグニチャーを持つメソッドを選択する際に使用されます。 メソッドは、多重定義することができます。
ID-2 を指定する場合は、オプションの句を指定せずに、ID-1 を USAGE OBJECT REFERENCE として定義する必要があります。つまり、ID-1 はユニバーサル・オブジェクト・リファレンスでなければなりません。
ID-2 の内容は、大文字小文字を区別して解釈されます。 INVOKE ステートメントの USING 句に指定したメソッド名、引数の数、および引数のデータ型は、 オブジェクトでサポートされた一致するシグニチャーを持つメソッドを選択する際に使用されます。 メソッドは、多重定義することができます。
ID-2 をウィンドウ表示日付フィールドにすることはできません。
クラス名-1 を Java でインプリメントした場合は、INVOKE ステートメントの USING 句を指定できます。 INVOKE ステートメントの USING 句に指定した引数の数と引数のデータ型は、 クラスでサポートされた一致するシグニチャーを持つ Java コンストラクターを選択する際に使用されます。 クラス名-1 クラスのオブジェクト・インスタンスは割り振られ、 選択されたコンストラクター (または、デフォルトのコンストラクター) は実行され、 生成されたオブジェクトへの参照は戻されます。
クラス名-1 を COBOL でインプリメントした場合は、INVOKE ステートメントの USING 句を指定することはできません。クラス名-1 クラスのオブジェクト・インスタンスは割り振られ、インスタンス・データ項目は関連する VALUE 節で指定 された値に初期化され、生成されたオブジェクトへの参照は戻されます。
NEW を指定する場合は、RETURNING 句も指定する必要があります。詳しくは、RETURNING 句を参照してください。
USING 句は、ターゲット・メソッドに渡される引数を指定します。 引数のデータ型および引数のリンケージ規約は、Java でサポートされるものに制限されます。 詳細については、BY VALUE 句を参照してください。
INVOKE ステートメントに指定する引数は、BY VALUE によって渡す必要があります。
BY VALUE 句では、送り出すデータ項目への参照ではなく、引数の値が渡されることが 指定されます。呼び出されるメソッドは、値によって渡された引数に対応する仮パラメーターを修正できますが、 呼び出されるメソッドは送り出しデータ項目の一時コピーへのアクセス権のみを持っているため、変更がこの引数に影響することはありません。
ID-3 に適用される追加要件については、引数の適合性要件を参照してください。
リテラル-2 は DBCS リテラルであってはいけません。
ID-3 がオブジェクト・リファレンスのときには、以下の規則が適用されます。
ID-3 がオブジェクト・リファレンスではないときには、以下の規則が適用されます。
使用上の注意: 引数の適合性要件の順守は、プログラマーの責任範囲です。コンパイラーでは、これらの要件は検査されません。
RETURNING 句は、呼び出したメソッドから戻された値を入れるデータ項目を指定します。 INVOKE ステートメントに RETURNING 句を指定できるのは、COBOL または Java で作成されたメソッドを呼び出すときです。
ID-4 のデータ型は、Java 相互協調処理に対応したデータ型にする必要があります。詳しくは、COBOL と Java の相互運用可能なデータ型を参照してください。
ID-4 に適用される追加要件については、RETURNING 項目の適合性要件を参照してください。
ID-4 が指定され、ターゲット・メソッドが COBOL で作成されている場合、 そのターゲット・メソッドの手続き部ヘッダーには RETURNING 句が必要です。ターゲット・メソッドが戻されるときは、ID-4 が USAGE OBJECT REFERENCE を使用して記述された場合、SET ステートメントの規則を使用して、その戻り値が ID-4 に割り当てられます。それ以外の場合は、MOVE ステートメントの規則が使用されます。
RETURNING データ項目は、出力専用のパラメーターです。 呼び出されるメソッドに入った時点で、 PROCEDURE DIVISION RETURNING データ項目の初期状態の値は未定義であり予測不可能です。 呼び出されるメソッドの PROCEDURE DIVISION RETURNING データ項目を初期化してから、 値を参照するようにしてください。 呼び出したメソッドが戻されるとき、呼び出し側に渡される値は、PROCEDURE DIVISION RETURNING データ項目の最終的な値です。
Java で定義されたローカル・オブジェクト・リファレンスおよびグローバル・オブジェクト・リファレンスについては、「Enterprise COBOL プログラミング・ガイド」これらの属性は、 オブジェクト・リファレンスの存続時間に影響を与えます。
使用上の注意: RETURN-CODE 特殊レジスターは、INVOKE ステートメントの実行では設定されません。
INVOKE ステートメントにクラス名-1 NEW を指定するには、RETURNING 句が必要です。 RETURNING 項目は、以下のいずれかでなければなりません。
INVOKE ステートメントに NEW 句を指定しない場合、メソッド呼び出し、および対応するターゲット・メソッドで 指定される RETURNING 項目は、以下の要件を満たす必要があります。
使用上の注意: RETURNING 項目の適合性要件の順守は、プログラマーの責任範囲です。コンパイラーでは、これらの要件は検査されません。
INVOKE ステートメントで指定されたメソッドのシグニチャーと一致する シグニチャーを持つメソッドが、識別されたオブジェクトまたはクラスでサポートされない場合は、 例外条件が発生します。例外条件が発生すると、以下のアクションのいずれかが実行されます。
この明示的範囲終了符号は、INVOKE ステートメントの範囲を区切るために使用されます。END-INVOKE で終了する INVOKE ステートメントとそれに含まれるステートメントは、 命令ステートメントのように処理される単位になります。 INVOKE ステートメントは、条件ステートメント内の命令ステートメントとして指定できます。例えば、 別のステートメントの例外句の中に指定できます。
COBOL データ型のサブセットは、COBOL と Java の相互協調処理のために使用できます。
COBOL INVOKE ステートメントの引数や RETURNING 項目として、 相互運用可能なデータ型を指定できます。 同様に、これらのデータ型を Java メソッド呼び出し式から引数として渡し、USING 句のパラメーターとして、 または COBOL メソッドの手続き部ヘッダー内の RETURNING 項目として、それらを受け取ることができます。
以下の表には、相互協調処理でサポートされる基本的な Java 型と COBOL データ型、 およびそれらの間の対応関係が示されています。
| Java データ型 | COBOL データ型 |
|---|---|
| boolean1 | 形式に対する条件変数と 2 つの条件名
level-number data-name PIC X. 88 data-name-false VALUE X'00'. 88 data-name-true VALUE X'01' THROUGH X'FF'. |
| byte | 1 バイトの英数字、PIC X または PIC A |
| short | USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (1 <= n <= 4) |
| int | USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (5 <= n <= 9) |
| long | USAGE BINARY、COMP、COMP-4、または COMP-5。PICTURE 節は S9(n) 形式 (10 <= n <= 18) |
| float2 | USAGE COMP-1 |
| double2 | USAGE COMP-2 |
| char | 単一文字 (国別) : PIC N USAGE NATIONAL |
クラス型 |
USAGE OBJECT REFERENCE クラス名 |
|
|
基本タイプに加えて、Java String と Java 基本型の配列も、COBOL と相互運用が可能です。 ただし、これを行うには、COBOL ランタイム・システムと Java Native Interface (JNI) で提供される特別なメカニズムが必要 となります。
配列データを COBOL に渡したり、COBOL から受け取ったりする場合、Java プログラムでは、 通常の Java 構文を使用して、配列の型を宣言します。 COBOL プログラムでは、配列をサポートするために提供されている特別なクラスのインスタンスを含むオブジェクト・リファレンス として、配列を宣言します。メソッドを呼び出す場合、Java 型と COBOL 型の間の変換は、自動的に行われます。
String データを COBOL に渡したり、COBOL から受け取ったりする場合、Java プログラムでは、 通常の Java 構文を使用して、配列の型を宣言します。 COBOL プログラムでは、特別な jstring クラスのインスタンスを含むオブジェクト・リファレンス として、String を宣言します。メソッドを呼び出す場合、Java 型と COBOL 型の間の変換は、自動的に行われます。 以下の表には、Java 配列、String データ型、および対応する特別な COBOL データ型が示されています。
| Java データ型 | COBOL データ型 |
|---|---|
| boolean[ ] | オブジェクト・リファレンス jboooleanArray |
| byte[ ] | オブジェクト・リファレンス jbyteArray |
| short[ ] | オブジェクト・リファレンス jshortArray |
| int[ ] | オブジェクト・リファレンス jintArray |
| long[ ] | オブジェクト・リファレンス jlongArray |
| char[ ] | オブジェクト・リファレンス jcharArray |
| Object[ ] | オブジェクト・リファレンス jobjectArray |
| String | オブジェクト・リファレンス jstring |
以下の Java 配列型は、現在サポートされていません。
| Java データ型 | COBOL データ型 |
|---|---|
| float[ ] | オブジェクト・リファレンス jfloatArray |
| double[ ] | オブジェクト・リファレンス jdoubleArray |
REPOSITORY 段落では、他のクラスで項目をコード化するのと同様に、 使用する特別なクラスごとに項目のコード化が必要です。例えば、jstring を使用する場合は、以下の項目をコード化します。
Configuration Section.
Repository.
Class jstring is "jstring".
また、String 型の場合は、COBOL リポジトリー項目で java.lang.String の外部クラス名を指定します。
Repository.
Class jstring is "java.lang.String".
Java Native Interface (JNI) では、これらの型の COBOL オブジェクトを COBOL で操作するための 呼び出し可能なサービスが提供されています。 例えば、呼び出し可能サービスを使用すると、jstring オブジェクト内に COBOL の英数字データまたは国別データを 設定したり、jstring オブジェクトからデータを抽出したりすることができます。 JNI 呼び出し可能サービスの使用方法については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
クラス定義のためのリポジトリー項目については、REPOSITORY 段落を参照してください。例については、「Enterprise COBOL プログラミング・ガイド」を参照してください。
以下の表では、INVOKE ステートメントの引数として使用可能な各種の COBOL 項目の例と、 それに対応する Java 型を示しています。
| COBOL 引数 | 対応する Java データ型 |
|---|---|
| 長さが 1 で USAGE DISPLAY の参照変更項目 | byte |
| 長さが 1 で USAGE NATIONAL の参照変更項目 (USAGE NATIONAL の基本データ項目または国別グループ項目のいずれか) | char |
| SHIFT-IN および SHIFT-OUT 特殊レジスター | byte |
| USAGE BINARY のときの LINAGE-COUNTER 特殊レジスター | int |
| LENGTH OF 特殊レジスター | int |
以下の表には、INVOKE ステートメントの引数として使用可能な COBOL リテラルのタイプと、 それに対応する Java 型を示しています。