invoke()

javaLib.invoke() システム関数は、EGL Java™ オブジェクト・スペース内のローカル Java オブジェクトまたはクラスのメソッドを呼び出し、値を戻すことができます。

javaLib.invoke() および類似する関数が実行される、EGL Java オブジェクト・スペースについて詳しくは、『EGL プリミティブ型の Java へのマッピング』を参照してください。 EGL は、この Java アクセスのメソッドを以前のバージョンとの互換性のために保守します。新規コードの場合は、より強力な ExternalType 構文を使用してください。詳しくは、『ExternalType パーツ』を参照してください。

構文

  javaLib.invoke(
    identifierOrClass javaObjIdOrClass in,
    method STRING in
    {, argument anyEglPrimitive in})
  returns (result anyJavaPrimitive)
identifierOrClass
以下のエンティティーはこの引数として機能することができます。
  • Java objID (Java オブジェクト・スペースにあるオブジェクトのメソッドを呼び出す場合)。
  • ストリング (クラスのメソッド (静的メソッド) を呼び出す場合)。 EGL は、大/小文字の区別がある引数値の先頭と最後から、1 バイトのブランクと 2 バイトのブランクを削除します。

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

method
呼び出すメソッドの名前 (大/小文字を区別)。

STRING 型との代入互換性のある任意の変数または式を入力できます。 ストリングの先頭と最後から、1 バイトのブランクと 2 バイトのブランクが削除されます。

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

Java の型変換の規則が適用されます。 キャストが必要になる場合があります。『EGL プリミティブ型の Java へのマッピング』を参照してください。精度が失われるのを避けるために、 Java の double には EGL の FLOAT 変数を使用し、 Java の float には EGL の SMALLFLOAT 変数を使用してください。 それ以外の EGL の型を使用すると、丸め誤差が生じる場合があります。

以下に示すように、EGL 外部型の値は有効です。
SharedResourcePowerServer srps = JavaLib.getSharedResourcePowerServer();
JavaLib.invoke("anObject" as "objID:java", "aMethod", srps);

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

result
結果フィールドが存在する場合は、結果フィールドがローカル Java メソッドからの値を受け取ります。

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

次のことが該当します。

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

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

  • ローカル Java メソッドが値を戻さないか、または NULL を戻す場合は、次のことが該当します。
    • 結果フィールドが存在しない場合は、エラーが発生しません。
    • 結果フィールドが存在する場合は、実行時にエラーが発生します。エラーは、00001004 (後述) です。

以下の例では、特に明記されていない限り、Java objID 型へのキャスト (「as」演算子を使用) が必要です。
  // Java の Date クラスのコンストラクターを呼び出し、
  // 識別子「date」に新規オブジェクトを割り当てます
  javaLib.storeNew("date" as "objID:java", "java.util.Date");

  // 新規の Date オブジェクトの toString メソッドを呼び出します
  // 出力 (今日の日付) を charVar に代入します
  charVar = javaLib.invoke("date" as "objID:java", "toString" );

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

  // 出力の println メソッドを呼び出します
  // 今日の日付を出力します
  javaLib.invoke("systemOut" as "objID:java", "println", charVar );
「java.lang.System.out」を前の行の第 1 引数として使用することは無効です。 この引数は、既にオブジェクト・スペースに存在する識別子、あるいはクラス名のいずれかである必要があるためです。この引数は static フィールドを参照できません。

エラーに関する考慮事項

v60ExceptionCompatibility プログラム・プロパティーが設定されていないか、NO に設定されている場合、例外が発生すると、EGL は JavaObjectException をスローします。 その他のエラーが発生した場合は、EGL によって RuntimeException がスローされます。

v60ExceptionCompatibility プログラム・プロパティーが YES に設定されている場合、javaLib.invoke() の処理中にエラーが発生すると、sysVar.errorCode は次の表の値に設定されます。

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

フィードバック