Core JavaScript 1.5 Guide:LiveConnect Overview:JavaScript to Java Communication
出典: MDC
目次 |
[編集] JavaScript から Java への通信
Java のパッケージやクラスを参照したり、Java のオブジェクトや配列を扱ったりするときには、特別な LiveConnect オブジェクトを使用します。JavaScript から Java へのアクセスはすべてこれらのオブジェクトを用いて行われます。それらのオブジェクトについて以下の表で簡単にまとめます。
| オブジェクト | 説明 |
|---|---|
| JavaArray | ラップされた Java の配列。JavaScript コード内からアクセスされる。 |
| JavaClass | Java のクラスへの JavaScript からの参照。 |
| JavaObject | ラップされた Java のオブジェクト。JavaScript コード内からアクセスされる。 |
| JavaPackage | Java のパッケージへの JavaScript からの参照。 |
表 9.1 LiveConnect オブジェクト
注意:Java は強く型付けされた言語であり、JavaScript は弱く型付けされた言語であるため、LiveConnect を使用する際はもう一方の言語のために JavaScript ランタイムエンジンが引数の値を適当なデータ型に変換します。詳細は データ型の変換 をご覧ください。
ある意味で LiveConnect オブジェクトの存在は透過的です。かなり直観的に Java とやりとりできるからです。例えば、次のように Java の String オブジェクトを作成し、new 演算子を Java のコンストラクタとともに用いてそのオブジェクトを JavaScript の変数 myString に代入することができます。
var myString = new java.lang.String("Hello world")
この例では、変数 myString は JavaObject になります。Java の String オブジェクトのインスタンスを保持しているためです。JavaObject として、myString は java.lang.String およびそのスーパークラスである java.lang.Object のパブリックなインスタンスメソッドにアクセスできます。これらの Java のメソッドは JavaScript から JavaObject のメソッドとして使用できます。また、それは次のようにしてを呼び出すことができます。
myString.length() // 11 を返す
JavaClass オブジェクトの静的メンバは直接呼び出すことができます。
alert(java.lang.Integer.MAX_VALUE); // 2147483647 というアラート
[編集] Packages オブジェクト
Java のクラスが java、sun あるいは netscape パッケージのいずれの一部でもない場合は、Packages オブジェクトを用いてそれにアクセスします。例えば、Redwood 社が、実装したさまざまな Java のクラスを格納するための redwood という名前の Java パッケージを使用することを想定します。redwood の HelloWorld クラスのインスタンスを作成するには、次のようにそのクラスのコンストラクタにアクセスします。
var red = new Packages.redwood.HelloWorld()
デフォルトパッケージのクラス(すなわち明示的にはパッケージに名前を付けていないクラス)にアクセスすることもできます。例えば、HelloWorld クラスが直接 CLASSPATH に入っており、パッケージには入っていない場合、次のようにしてそれにアクセスできます。
var red = new Packages.HelloWorld()
LiveConnect の java、sun および netscape オブジェクトはよく使用される Java のパッケージであるために、短縮記法が備わっています。例えば次のように使用できます。
var myString = new java.lang.String("Hello world")
これは次のものを省略したものです。
var myString = new Packages.java.lang.String("Hello world")
[編集] Java の配列の使用
Java のメソッドで配列を作成し、JavaScript からその配列を参照するときは JavaArray を使用します。例えば、次のコードは int 型の 10 個の要素を持つ JavaArray x を作成します。
x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10)
JavaScript の Array オブジェクトのように、JavaArray にはその配列の要素数を返す length プロパティがあります。Array.length とは異なり、JavaArray.length は読み取り専用のプロパティです。Java の配列は作成時に要素数が固定されるためです。
[編集] パッケージおよびクラスの参照
JavaScript から Java のパッケージやクラスへの簡単な参照では JavaPackage や JavaClass オブジェクトが作成されます。先の Redwood 社についての例では、例えば Packages.redwood という参照が JavaPackage オブジェクトです。同様に java.lang.String のような参照は JavaClass オブジェクトです。
ほとんどの場合は JavaPackage および JavaClass オブジェクトについて気にする必要はありません。ただ Java のパッケージやクラスを使うだけのことであり、LiveConnect がこれらオブジェクトを透過的に生成するからです。
JavaScript 1.3 以前では JavaClass オブジェクトをパラメータとして Java のメソッドに渡す際に自動的には java.lang.Class のインスタンスに変換されません。そのため、java.lang.Class のインスタンスのラッパを作成しなければなりません。次の例では、forName メソッドがラッパオブジェクトである theClass を生成します。そしてそれを newInstance メソッドに渡し、配列を生成します。
// JavaScript 1.3
theClass = java.lang.Class.forName("java.lang.String")
theArray = java.lang.reflect.Array.newInstance(theClass, 5)
JavaScript 1.4 以降では次の例のように JavaClass オブジェクトをメソッドに直接渡すことができます。
// JavaScript 1.4 theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5)
[編集] char 型の引数
JavaScript 1.4 以降では char 型の引数を必要とする Java のメソッドに 1 文字の文字列を渡すことができます。例えば、次のようにして文字列 "H" を Character コンストラクタに渡すことができます。
c = new java.lang.Character("H")
JavaScript 1.3 以前では、このようなメソッドにはその文字の Unicode 値に対応する整数を渡さなければなりません。例えば、次のコードも "H" という値を変数 c に代入するものです。
c = new java.lang.Character(72)
[編集] JavaScript での Java の例外処理
Java のコードが実行時に失敗すると例外を投げます。JavaScript のコードが Java のデータメンバまたはメソッドにアクセスし、失敗すると、Java の例外が JavaScript に渡されます。それを処理できるようにするためです。JavaScript 1.4 からは try...catch 文でこの例外を受け取ることができます。
例えば、Java の forName メソッドを使用して Java のクラス名を theClass という変数に代入するとします。forName メソッドに渡す値が Java のクラス名に評価できなければそのメソッドは例外を投げます。次のようにして、例外を処理できるように forName 代入文を try ブロック内に置きます。
function getClass(javaClassName) {
try {
var theClass = java.lang.Class.forName(javaClassName);
} catch (e) {
return ("The Java exception is " + e);
}
return theClass
}
この例では、javaClassName が "java.lang.String" のような正当なクラス名に評価されると代入が成功します。javaClassName が "String" のような不正なクラス名に評価されると getClass 関数が例外を受け取り、次のようなものを返します。
The Java exception is java.lang.ClassNotFoundException: String
例外の型に基づいて特別な処理をするには instanceof 演算子を使用します。
try {
// ...
} catch (e) {
if (e instanceof java.io.FileNotFound) {
// FileNotFound についての処理
} else {
throw e;
}
}
JavaScript の例外についての詳細情報は 例外処理文 を参照してください。