EGL から Java™ を生成する場合、複数の方法で Java コードを呼び出すことができます。 このトピックでは、JavaLib システム・ライブラリー内のシステム関数 (javaLib.invoke() など) の使用、 ExternalType パーツの宣言など、最も一般的な方法をいくつか紹介します。
Java クラス内のメソッドを 1 回だけ使用する必要がある場合は、javaLib.invoke システム関数を使用できます。
この例では、random メソッドを呼び出します。このメソッドは java.lang.Math クラスに属しており、0 から 1 の間の 乱数を返します。今回の場合、このクラスは EGL ライブラリーに似ており、このメソッドは このライブラリー内の関数のように機能します。
この方法で呼び出すことのできるメソッドは、static として定義されているメソッドのみです。「static」とは Java 用語であり、EGL にはこれに対応する用語がありません。 今回の文脈においては、そのメソッドの呼び出しがいつでも可能であり、 使用前に初期化する必要がないことを表します。
myNumber float;
myNumber = javaLib.invoke("java.lang.Math", "random");
sysLib.writeStderr(strLib.formatNumber(myNumber));
メソッドにパラメーターを渡すには、javaLib.invoke() の argument パラメーターを使用します。
Java クラス内のメソッドを 複数回呼び出す場合や、呼び出すメソッドが静的として定義されていない場合には、 後述の『クラスを表わす ExternalType パーツの作成』の手順に従って、ExternalType パーツを作成する必要があります。 ただし、移行したプログラムとの互換性を維持しつつ EGL コードの量を抑えるために、javaLib 内の他の関数を使用することで、 クラスやその非静的メソッドを初期化して、繰り返し使用することができます。
//エラー! nextInt() メソッドは静的ではありません。
myInt int = javaLib.invoke("java.util.Random", "nextInt");
javaLib.storeNew("myRandomGenerator" AS "objId:java", "java.util.Random");
myInt int = javaLib.invoke("myRandomGenerator" AS "objId:java", "nextInt");
これらの例では、文字列 myRandomGenerator が クラスを表わす ID となります。AS "objId:java" というコードによって、 この ID が EGL パーツやストリング・リテラルを参照しているのではなく Java クラスを参照していることが、このクラスを使用するたびに EGL に通知されます。詳しくは、as 演算子を参照してください。Java クラスおよびメソッドの呼び出しについて詳しくは、Java アクセス関数を参照してください。
クラスを頻繁に使用する場合や、使用するメソッドが静的として定義されていない場合は 、Java クラスを直接表わす EGL パーツである EGL ExternalType パーツを定義することができます。 ExternalType パーツを定義すると、このパーツに基づいて変数を 作成することができ、EGL ライブラリーの名前を使用するのと同じように、 それらの変数を使用できます。
この例では、java.util.Random クラスを使用します。 このクラスは、ランダムな整数を返す非静的メソッドである nextInt を持っています。 ここでも、EGL プログラミングを行うために、クラスをライブラリーとして メソッドを関数として考えてください。
ExternalType Random type JavaObject
{packageName = "java.util",
javaName = "Random"}
//ここにプロパティーが挿入されます。
end
Java クラスの名前は、以下の 2 つのプロパティーに分かれます。ExternalType Random type JavaObject
{packageName = "java.util",
javaName = "Random"}
function nextInt() returns(int);
end
インターフェース・パーツの場合と同様に、Java の関数プロトタイプは、EGL の関数プロトタイプと類似しています。関数プロトタイプは、関数またはメソッド名、
その引数および戻り値をリストしますが、内部ロジックは持ちません。ここでは、プロトタイプによって
、ExternalType パーツ内の関数が Java クラス内のメソッドにリンクしています。また 、Java の型を、互換性のある EGL 型と一致させるように注意することも必要です (その逆も同様)。 EGL パーツと Javaパーツの関連を示した表は、EGL プリミティブ型の Java へのマッピングに記載されています。
ExternalType Random type JavaObject
{packageName = "java.util",
javaName = "Random"}
function nextInt() returns(int);
constructor();
end
myRandomGenerator Random = new Random();
new Random() コードは、実際にはパーツ定義内の constructor() 関数プロトタイプに対する関数呼び出しとなります。この関数プロトタイプは
、次に Java クラスのコンストラクターを参照します。myInt int = myRandomGenerator.nextInt();
sysLib.writeStderr(strLib.formatNumber(myInt));
/*
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 パーツを参照してください。