Java の呼び出し

EGL から Java™ を生成する場合、複数の方法で Java コードを呼び出すことができます。 このトピックでは、JavaLib システム・ライブラリー内のシステム関数 (javaLib.invoke() など) の使用、 ExternalType パーツの宣言など、最も一般的な方法をいくつか紹介します。

前提条件

Java クラスを 1 回呼び出す

Java クラス内のメソッドを 1 回だけ使用する必要がある場合は、javaLib.invoke システム関数を使用できます。

この例では、random メソッドを呼び出します。このメソッドは java.lang.Math クラスに属しており、0 から 1 の間の 乱数を返します。今回の場合、このクラスは EGL ライブラリーに似ており、このメソッドは このライブラリー内の関数のように機能します。

この方法で呼び出すことのできるメソッドは、static として定義されているメソッドのみです。「static」とは Java 用語であり、EGL にはこれに対応する用語がありません。 今回の文脈においては、そのメソッドの呼び出しがいつでも可能であり、 使用前に初期化する必要がないことを表します。

  1. 論理パーツ内の EGL 関数において、渡す必要のある変数、または戻り値を受け入れる必要のある変数を宣言します。
    myNumber float;
  2. javaLib.invoke() システム関数を使用してメソッドを呼び出し、 クラスの名前および呼び出すメソッドをパラメーターとして渡します。
    myNumber = javaLib.invoke("java.lang.Math", "random");
  3. 呼び出しの結果を、次のように使用できます。
    sysLib.writeStderr(strLib.formatNumber(myNumber));

メソッドにパラメーターを渡すには、javaLib.invoke()argument パラメーターを使用します。

Java クラスを複数回呼び出す

Java クラス内のメソッドを 複数回呼び出す場合や、呼び出すメソッドが静的として定義されていない場合には、 後述の『クラスを表わす ExternalType パーツの作成』の手順に従って、ExternalType パーツを作成する必要があります。 ただし、移行したプログラムとの互換性を維持しつつ EGL コードの量を抑えるために、javaLib 内の他の関数を使用することで、 クラスやその非静的メソッドを初期化して、繰り返し使用することができます。

以下の例では、乱数を返す別のクラスを使用しています。別の方法として、java.util.Random クラス内の nextInt メソッドを使用して、ランダムな整数を返しています。 このメソッドは静的として定義されていないため 、javaLib.invoke() を使用して nextInt を呼び出すには、 準備が必要になります。
//エラー! nextInt() メソッドは静的ではありません。
myInt int = javaLib.invoke("java.util.Random", "nextInt");
代わりに、 まずこのクラスを初期化してから、javaLib.storeNew() を使用して、このクラスに EGL で ID を付与する必要があります。 Java の型を EGL に変換するには、キャスト演算子 AS を使用します。
javaLib.storeNew("myRandomGenerator" AS "objId:java", "java.util.Random");
これで 、javaLib.invoke によってクラスを繰り返し使用できます。
myInt int = javaLib.invoke("myRandomGenerator" AS "objId:java", "nextInt");

これらの例では、文字列 myRandomGenerator が クラスを表わす ID となります。AS "objId:java" というコードによって、 この ID が EGL パーツやストリング・リテラルを参照しているのではなく Java クラスを参照していることが、このクラスを使用するたびに EGL に通知されます。詳しくは、as 演算子を参照してください。Java クラスおよびメソッドの呼び出しについて詳しくは、Java アクセス関数を参照してください。

クラスを表わす ExternalType パーツの作成

クラスを頻繁に使用する場合や、使用するメソッドが静的として定義されていない場合は 、Java クラスを直接表わす EGL パーツである EGL ExternalType パーツを定義することができます。 ExternalType パーツを定義すると、このパーツに基づいて変数を 作成することができ、EGL ライブラリーの名前を使用するのと同じように、 それらの変数を使用できます。

この例では、java.util.Random クラスを使用します。 このクラスは、ランダムな整数を返す非静的メソッドである nextInt を持っています。 ここでも、EGL プログラミングを行うために、クラスをライブラリーとして メソッドを関数として考えてください。

  1. EGL ソース・ファイルで、ExternalType パーツを定義します。使用する Java クラスの名前を、ExternalType パーツに付けてください。
    ExternalType Random type JavaObject
        {packageName = "java.util", 
        javaName = "Random"}
    //ここにプロパティーが挿入されます。
    end
    Java クラスの名前は、以下の 2 つのプロパティーに分かれます。
    • packageName は、クラスを保持するパッケージの名前です。 Java パッケージと EGL パッケージは、ほぼ同様に機能します。
    • javaName は、Java クラス自体の名前です。 ExternalType パーツには、クラスと同じ名前を付けることができます。
  2. ExternalType パーツ内で、使用したいクラス内のメソッドを表わす関数プロトタイプ を 作成します。
    ExternalType Random type JavaObject
        {packageName = "java.util", 
        javaName = "Random"}
        function nextInt() returns(int);
    end
    インターフェース・パーツの場合と同様に、Java の関数プロトタイプは、EGL の関数プロトタイプと類似しています。関数プロトタイプは、関数またはメソッド名、 その引数および戻り値をリストしますが、内部ロジックは持ちません。ここでは、プロトタイプによって 、ExternalType パーツ内の関数が Java クラス内のメソッドにリンクしています。

    また 、Java の型を、互換性のある EGL 型と一致させるように注意することも必要です (その逆も同様)。 EGL パーツと Javaパーツの関連を示した表は、EGL プリミティブ型の Java へのマッピングに記載されています。

  3. ExternalType パーツには、コンストラクター も必要になります。 EGL 用語におけるコンストラクターとは、 パーツに基づいて新規の変数が作成される際に実行される関数のことを指します。 コンストラクターの使用は EGL では一般的ではありません。 コンストラクターについての詳細は、new 演算子を 参照してください。
    ExternalType Random type JavaObject
        {packageName = "java.util", 
        javaName = "Random"}
        function nextInt() returns(int);
        constructor();
    end
  4. ExternalType パーツに基づいて変数を作成するには、まず new キーワードと パーツの名前を使用して、そのコンストラクターを呼び出す必要があります。
    myRandomGenerator Random = new Random();
    new Random() コードは、実際にはパーツ定義内の constructor() 関数プロトタイプに対する関数呼び出しとなります。この関数プロトタイプは 、次に Java クラスのコンストラクターを参照します。
  5. EGL ライブラリーを使用するのと同じ方法で、ExternalType 内の関数を使用します。
    myInt int = myRandomGenerator.nextInt();
    sysLib.writeStderr(strLib.formatNumber(myInt));
これまでに説明した方法で ExternalType パーツを使用している プログラムの完全な例を、以下に示します。
/*
ExternalType パーツを使用して、
ランダムな整数をコンソールに書き込みます
*/
program ExternalTypeTest type BasicProgram

    function main()
        myRandomGenerator Random = new Random();
        myInt int = myRandomGenerator.nextInt();
        SysLib.writeStderr(StrLib.formatNumber(myInt));
    end
    
end

externalType Random type JavaObject 
    {packageName = "java.util", 
    javaName = "Random"}
    constructor();
    function nextInt() returns(int);
end

ExternalType パーツについて詳しくは、ExternalType パーツを参照してください。


フィードバック