invoke()

システム関数 JavaLib.invoke は、ネイティブ Java™ オブジェクトまたはクラスのメソッドを呼び出し、値を戻すことができます。JavaLib.invoke は、Java アクセス関数の 1 つです。

  JavaLib.invoke(
    identifierOrClass javaObjIdOrClass in,
    method STRING in
    {, argument anyEglPrimitive in})
  returns (result anyJavaPrimitive)
result
結果フィールドが存在する場合は、結果フィールドがネイティブ Java メソッドからの値を受け取ります。

ネイティブ Java メソッドが値を戻す場合、結果フィールドはオプションです。

次のことが該当します。

  • 戻り値が BigDecimal、BigInteger、byte、short、int、long、float、または double の場合、結果フィールドは数値データ型でなければなりません。特性は値と同じである必要はありません。 例えば、float は、小数桁数なしで宣言された結果フィールドに保管できます。 オーバーフロー処理の詳細については、『VGVar.handleOverflow』および『SysVar.overflowIndicator』 を参照してください。
  • 戻り値がブール値の場合、結果フィールドは、数値プリミティブ型でなければなりません。値は、真の場合は 1、偽の場合は 0 です。
  • 戻り値がバイト配列の場合、結果フィールドは、HEX 型でなければなりません。長さが一致しない場合については、『代入』を参照してください。
  • 戻り値が String または char の場合、結果フィールドは、CHAR 型、DBCHAR 型、MBCHAR 型、STRING 型、または UNICODE 型でなければなりません。
    • 結果フィールドが MBCHAR 型、STRING 型、または UNICODE 型である場合、戻り値は常に適切な値になります。
    • 結果フィールドが CHAR 型の場合、戻り値に DBCHAR 文字に相当する文字が含まれていると、問題が発生することがあります。
    • 結果フィールドが DBCHAR 型の場合、戻り値に 1 バイト文字に相当するユニコード文字が含まれていると、問題が発生することがあります。

    長さが一致しない場合については、『代入』を参照してください。

  • ネイティブ Java メソッドが値を戻さないか、または NULL を戻す場合は、次のことが該当します。
    • 結果フィールドが存在しない場合は、エラーが発生しません。
    • 結果フィールドが存在する場合は、実行時にエラーが発生します。エラーは、00001004 (後述) です。
identifierOrClass
この引数は、次のエンティティーのいずれかです。
  • オブジェクト・スペース内のオブジェクトを参照する ID
  • Java クラスの完全修飾名

この引数は、文字列リテラル、または CHAR 型、DBCHAR 型、MBCHAR 型、UNICODE 型の変数のいずれかです。オブジェクトの ID を指定する場合は、後述の例のように、その ID を objID にキャストする必要があります。EGL は、大/小文字の区別がある引数値の先頭と最後から、1 バイトのブランクと 2 バイトのブランクを削除します。

オブジェクト ID を作成するまでは、オブジェクト上のメソッドをコードで呼び出すことはできません。後述の例では、PrintStream オブジェクトを参照する java.lang.System.out を使用して、この点を説明します。

method
呼び出すメソッドの名前。

この引数は、文字列リテラル、または CHAR 型、DBCHAR 型、MBCHAR 型、UNICODE 型の変数のいずれかです。大/小文字の区別があるストリングの先頭と最後から、1 バイトのブランクと 2 バイトのブランクが削除されます。

argument
メソッドに渡される値。

Java アクセス (システム・ワード)』に記述したキャストが必要な場合があります。

Java の型変換の規則が適用されます。 例えば、int として宣言されたメソッド・パラメーターに short を渡しても、エラーは発生しません。

精度が失われるのを避けるために、Java の double には EGL の float 変数を使用し、 Java の float には EGL の smallfloat 変数を使用してください。それ以外の EGL の型を使用すると、多くの場合、結果としての値が丸められます。

呼び出し側プログラムのメモリー領域は、メソッドの実行内容にかかわらず、変更されません。

次の例では、特に注記がない限り、キャスト (objId) が必要です。
  // Java Date クラスのコンストラクターを呼び出し
  // 新規オブジェクトを ID "date" に割り当てます。
  JavaLib.storeNew( (objId)"date", "java.util.Date");

  // 新規 Date オブジェクトの toString メソッドを呼び出し
  // 出力 (本日の日付) を chaItem に割り当てます。
  // キャスト (objId) が存在しない場合、"date" は
  // オブジェクトではなくクラスを参照します。
  chaItem = JavaLib.invoke( (objId)"date", "toString" );

  // Java System クラスの標準出力ストリームを
  // ID "systemOut" に割り当てます。
  JavaLib.storeField( (objId)"systemOut", "java.lang.System", "out" );

  // 出力ストリームの println メソッドを呼び出し
  // 今日の日付を出力します。
  JavaLib.invoke( (objID)"systemOut", "println", chaItem );

  // "java.lang.System.out" を
  // 前の行の第 1 引数として使用すると、
  // 無効です。この引数は、すでにオブジェクト・スペース内にある
  // 識別子であるか、クラス名であることが必要だからです。
  // この引数は static フィールドを参照できません。

JavaLib.invoke の処理中にエラーが発生すると、SysVar.errorCode は、以下の表にリストされている値に設定されます。

SysVar.errorCode の値 説明
00001000 呼び出されたメソッドによって、またはクラスの初期化の結果として、例外がスローされました。
00001001 オブジェクトが NULL でした。または指定された ID がオブジェクト・スペース内にありませんでした。
00001002 指定された名前の public メソッド、フィールド、またはクラスが存在しないか、ロードできません。
00001003 EGL プリミティブ型が、Java で想定される型と同じではありません。
00001004 メソッドが NULL を戻したか、メソッドが値を戻さないか、またはフィールドの値が NULL でした。
00001005 戻り値が、戻り変数の型と一致しません。
00001006 NULL へキャストする引数のクラスをロードできませんでした。
00001007 メソッドまたはフィールドに関する情報の取得中に、SecurityException または IllegalAccessException がスローされました。または、final 宣言されたフィールドの値を設定しようとしました。
00001009 クラス名ではなく、ID を指定する必要があります。メソッドまたはフィールドが静的ではありません。

関連概念

関連タスク
EGL 文およびコマンドの構文図

関連リファレンス
代入
BIN および整数型
EGL ライブラリー JavaLib
例外処理

getField()
isNull()
isObjID()
qualifiedTypeName()
remove()
removeAll()
setField()
store()
storeCopy()
storeField()
storeNew()
プリミティブ型
overflowIndicator
handleOverflow

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.