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