Please note, this is a STATIC archive of website developer.mozilla.org from November 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

LiveConnect の概要

この章では、Java のコードと JavaScript のコードが相互通信を可能にする技術である LiveConnect の使用方法を解説します。この章の読者は、Java プログラミングの経験があるものとします。

ラッパの使用

JavaScript において、ラッパとは元の言語のオブジェクトをくるんだ、ターゲットとする言語のデータ型のオブジェクトです。JavaScript でプログラミングをするときは、ラッパオブジェクトを用いることで Java のメソッドやフィールドにアクセスすることができます。つまり、ラッパのメソッドを呼び出したりプロパティにアクセスすることで、Java のオブジェクトにおいて呼び出すことになります。Java 側では JavaScript のオブジェクトがクラス netscape.javascript.JSObject のインスタンスでラップされ、Java に渡されます。

JavaScript のオブジェクトが Java に送られる際、ランタイムエンジンは JSObject 型の Java ラッパを生成します。一方 JSObject が Java から JavaScript に送られるときは、ランタイムエンジンはそのラップを解き、元の JavaScript オブジェクトの種類に戻します。JSObject クラスには、JavaScript のメソッドを呼び出したり JavaScript のプロパティを調べるためのインタフェースが備わっています。

JavaScript から Java への通信

Java のパッケージやクラスを参照したり、Java のオブジェクトや配列を扱ったりするときは、特別な LiveConnect オブジェクトを使用します。JavaScript から Java へのアクセスはすべて、これらのオブジェクトを用いて行います。それらのオブジェクトについて、以下の表で簡単にまとめます。

表 9.1 LiveConnect オブジェクト
オブジェクト 説明
JavaArray ラップされた Java の配列です。JavaScript コード内からアクセスされます。
JavaClass Java のクラスへの JavaScript からの参照です。
JavaObject ラップされた Java のオブジェクトです。JavaScript コード内からアクセスされます。
JavaPackage Java のパッケージへの JavaScript からの参照です。

注意: Java は強く型付けされた言語であり、JavaScript は弱く型付けされた言語であるため、LiveConnect を使用する際はもう一方の言語のために JavaScript ランタイムエンジンが引数の値を適当なデータ型に変換します。詳細はデータ型の変換をご覧ください。

かなり直感的に Java とやりとりできることから、ある意味で LiveConnect オブジェクトの存在は透過的です。例えば、次のように Java の String オブジェクトを作成し、new 演算子を Java のコンストラクタとともに用いて、そのオブジェクトを JavaScript の変数 myString に代入することができます:

var myString = new java.lang.String("Hello world");

この例では、変数 myStringJavaObject になります。これは、Java の String オブジェクトのインスタンスを保持しているためです。JavaObject であるので、myStringjava.lang.String およびそのスーパークラスである java.lang.Object のパブリックなインスタンスメソッドにアクセスできます。これらの Java のメソッドは JavaScript から、JavaObject のメソッドとして使用できます:

myString.length(); // 11 を返す

JavaClass オブジェクトの静的メンバは直接呼び出すことができます。

alert(java.lang.Integer.MAX_VALUE); // 2147483647 というアラート

Packages オブジェクト

Java のクラスが javasun あるいは netscape パッケージのいずれの一部でもない場合は、Packages オブジェクトを用いてそれにアクセスします。例えば Redwood 社が、実装したさまざまな Java のクラスを格納するための、redwood という名前の Java パッケージを使用することを想定します。redwoodHelloWorld クラスのインスタンスを作成するには、次のようにそのクラスのコンストラクタにアクセスします:

var red = new Packages.redwood.HelloWorld();

デフォルトパッケージのクラス (すなわち、明示的にはパッケージに名前をつけていないクラス) にアクセスすることもできます。例えば、HelloWorld クラスが直接 CLASSPATH に入っており、またパッケージには入っていない場合は、次のようにしてそれにアクセスできます:

var red = new Packages.HelloWorld();

LiveConnect の javasun および 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 を作成します:

var x = java.lang.reflect.Array.newInstance(java.lang.Integer, 10);

JavaScript の Array オブジェクトのように、JavaArray にはその配列の要素数を返す length プロパティがあります。Array.length とは異なり、JavaArray.length は読み取り専用のプロパティです。これは、Java の配列は作成時に要素総数が固定されるためです。

パッケージおよびクラスの参照

JavaScript から Java のパッケージやクラスへの簡単な参照では、JavaPackageJavaClass オブジェクトが作成されます。先の Redwood 社についての例では、例えば Packages.redwood という参照が JavaPackage オブジェクトです。同様に、java.lang.String のような参照は JavaClass オブジェクトです。

ほとんどの場合は JavaPackageJavaClass オブジェクトについて気にする必要はありません。ただ Java のパッケージを使うだけのことであり、LiveConnect がこれらのオブジェクトを透過的に生成するからです。LiveConnect がクラスの読み込みに失敗する場合があり、そのときは以下のようにして手動で読み込みを行う必要があります:

var Widgetry = java.lang.Thread.currentThread().getContextClassLoader().loadClass("org.mywidgets.Widgetry");

JavaScript 1.3 以前では JavaClass オブジェクトをパラメータとして Java のメソッドとして渡す際に、自動的には java.lang.Class のインスタンスに変換されません。そのため、java.lang.Class のインスタンスのラッパを作成しなければなりません。次の例では、forName メソッドがラッパオブジェクトである theClass を生成します。そしてそれを newInstance メソッドに渡し、配列を生成します。

// JavaScript 1.3
var theClass = java.lang.Class.forName("java.lang.String");
var theArray = java.lang.reflect.Array.newInstance(theClass, 5);

JavaScript 1.4 以降では次の例のように、JavaClass オブジェクトをメソッドに直接渡すことができます:

// JavaScript 1.4
var theArray = java.lang.reflect.Array.newInstance(java.lang.String, 5);

char 型の引数

JavaScript 1.4 以降では char 型の引数を必要とする Java のメソッドに、1 文字の文字列を渡すことができます。例えば、次のようにして文字列 "H" を Character コンストラクタに渡すことができます:

var c = new java.lang.Character("H");

JavaScript 1.3 以前では、このようなメソッドにはその文字の Unicode 値に対応する整数値を渡さなければなりません。例えば、次のコードも "H" という文字列を変数 c に代入するものです:

var c = new java.lang.Character(72);

JavaScript での Java 例外の処理

Java のコードは実行時に失敗すると、例外を投げます。JavaScript のコードが Java のデータメンバまたはメソッドにアクセスし、失敗すると、Java の例外が JavaScript に渡されます。これは、例外を処理できるようにするためです。JavaScript 1.4 からは try...catch 文でこの例外を受け取ることができます。(Mozilla 固有の LiveConnect コードが Mozilla 内でメンテナンスされていなかったため、この機能は (他の一部機能もあわせて) Gecko 1.9 で壊れています (バグ 391642 をご覧ください)。しかし Java 6 アップデート 11 および 12 での、Mozilla の汎用 (かつクロスブラウザの) NPAPI プラグインコードに依存する構築のサポートにより修復されました。)

例えば、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 の例外についての詳細情報は例外処理文を参照してください。

Java から JavaScript への通信

Java で JavaScript のオブジェクトを使用したい場合は、その Java ファイルに netscape.javascript パッケージをインポートしなければなりません。このパッケージは次のクラスを定義しています:

これらのクラスの詳細は JavaScript リファレンスをご覧ください。

LiveConnect クラスの場所の特定

古いバージョンの Netscape ブラウザでは、これらのクラスがブラウザに同梱されていました。JavaScript 1.2 からは、これらのクラスは .jar ファイルに格納されています。それより古いバージョンの JavaScript では、これらのクラスは .zip ファイルに格納されています。例えば Windows NT 向けの Netscape Navigator 4 では、クラスは Navigator のディレクトリ直下の Program\Java\Classes ディレクトリ内の java40.jar ファイルに格納されています。

より最近では、クラスは Sun の Java ランタイムに同梱されています。はじめはランタイムディストリビューションの "jre/lib" ディレクトリ内の "jaws.jar" ファイルに入っていましたが (JRE 1.3)、その後同じ場所の "plugin.jar" に移っています (JRE 1.4 以降)。

JDK での LiveConnect クラスの使用

LiveConnect クラスにアクセスするには、次のどちらかの方法で JDK コンパイラの CLASSPATH に .jar または .zip ファイルを配置します:

  • CLASSPATH 環境変数を作成し、.jar または .zip ファイルのパスと名前を指定します。
  • コンパイル時に -classpath コマンドラインパラメータを用いて .jar または .zip ファイルの場所を指定する。

Windows NT では、コントロールパネルのシステムアイコンをダブルクリックし、CLASSPATH という名前のユーザ環境変数を作成し、それに次のような値を設定することで環境変数を作成できます:

C:\Program Files\Java\jre1.4.1\lib\plugin.jar

CLASSPATH についての詳細は Sun の JDK に関する資料をご覧ください。

注意: Java は強く型付けされた言語であり、JavaScript は弱く型付けされた言語であるため、LiveConnect を使用する際はもう一方の言語のために JavaScript ランタイムエンジンが引数の値を適当なデータ型に変換します。詳細は データ型の変換 をご覧ください。

LiveConnect クラスの使用

すべての JavaScript オブジェクトは、Java コード内では netscape.javascript.JSObject のインスタンスとして現れます。Java コード内でメソッドを呼び出すときに、その引数として JavaScriptのオブジェクトを渡すことができます。そうするためには、そのメソッドの対応する仮パラメータを JSObject 型で定義しなければなりません。

さらに、Java コード内で JavaScript のオブジェクトを使用するたびに、netscape.javascript.JSException 型の例外を処理する try...catch 文の内側で、その JavaScript オブジェクトを呼び出すようにしてください。こうすることで JSException 型の例外として Java で現れる、JavaScript コードの実行におけるエラーを Java コードで処理できるようになります。

JSObject を用いた JavaScript へのアクセス

例えば、JavaDog という Java のクラスを使用するとします。次のコードで示すように、JavaDog コンストラクタは JavaScript のオブジェクトである jsDog を引数としてとります。このオブジェクトは JSObject 型として定義されています:

import netscape.javascript.*;

public class JavaDog{
    public String dogBreed;
    public String dogColor;
    public String dogSex;

    // クラスコンストラクタの定義
    public JavaDog(JSObject jsDog){
        // ここで try...catch を使用して JSExceptions を処理できるようにする
        this.dogBreed = (String)jsDog.getMember("breed");
        this.dogColor = (String)jsDog.getMember("color");
        this.dogSex = (String)jsDog.getMember("sex");
    }
}

JSObjectgetMember メソッドは、JavaScript のオブジェクトのプロパティにアクセスするために使用するものです。この例では JavaScript のプロパティである jsDog.breed の値を Java のデータメンバである JavaDog.dogBreed に代入するために、getMember を使用しています。

注意: より現実的な例では try...catch 文の内側で getMember を呼び出し、JSException 型のエラーを処理できるようにします。詳細は、Java での JavaScript の例外処理を参照してください。

getMember の動作をさらに知るために、JavaScript の Dog オブジェクトを作成し、その定義を見てみます:

function Dog(breed,color,sex){
   this.breed = breed;
   this.color = color;
   this.sex = sex;
}

Dog の JavaScript のインスタンスである gabby は、次のようにして作ることができます:

var gabby = new Dog("lab", "chocolate", "female");

gabby.color を評価すると、それが "chocolate" という値を持っていることがわかります。ここで次のように gabby オブジェクトをコンストラクタに渡し、JavaScript コードで JavaDog のインスタンスを作成することにします:

var javaDog = new Packages.JavaDog(gabby);

javaDog.dogColor を評価すると、それも "chocolate" という値を持っていることがわかります。これは Java のコンストラクタ内の getMember メソッドが、gabby.color の値を dogColor に代入するからです。

Java での JavaScript の例外処理

実行時に Java からの JavaScript コードの呼び出しに失敗すると、例外が投げられます。Java から JavaScript コードを呼び出すときに、try...catch 文でこの例外を受け取ることができます。JavaScript の例外は、netscape.javascript.JSException のインスタンスとして Java コードから扱えます。

JSException は JavaScript が投げるあらゆる種類の例外に対応する、Java のラッパです。JSObject のインスタンスが JavaScript のオブジェクトのラッパであるのと同じようなものです。Java で JavaScript コードを評価するときは JSException を使用してください。

Java で JavaScript コードを評価する際、次の状況でランタイムエラーが発生します:

  • JavaScript コンパイルエラーまたは 実行時に生じた 他のエラーにより、JavaScript コードが評価されません。JavaScript インタプリタは、JSException のインスタンスに変換されるエラーメッセージを生成します。
  • Java は正常に JavaScript のコードを評価しましたが、処理方法が定かでない throw 文をJavaScript コードが実行します。JavaScript は、JSException のインスタンスとしてラップされる例外を投げます。Java でこの例外のラップを解くには、JSExceptiongetWrappedException メソッドを使用します。

例えば、Java のオブジェクトである jsCode が自身に渡される文字列 eTest を評価するとします。次のようなエラー処理を実行することで、評価が原因で発生するどちらの種類のランタイムエラーにも対応できます:

import netscape.javascript.JSObject;
import netscape.javascript.JSException;

public class eTest {
    public static Object doit(JSObject obj, String jsCode) {
        try {
            obj.eval(jsCode);
        } catch (JSException e) {
            if (e.getWrappedException() == null)
                return e;
            return e.getWrappedException();
        }
        return null;
    }
}

この例では、渡された文字列 jsCodetry ブロック内のコードが評価しようとします。文字列 "myFunction()" を jsCode の値として渡すとします。myFunction が JavaScript の関数として定義されていない場合、JavaScript インタプリタは jsCode を評価できません。インタプリタはエラーメッセージを生成し、Java のハンドラがそのメッセージを受け取り、doit メソッドは netscape.javascript.JSException のインスタンスを返します。

しかし、次のように myFunction が JavaScript で定義されているとします:

function myFunction() {
   try {
      if (theCondition == true) {
         return "Everything's ok";
      } else {
         throw "JavaScript error occurred";
      }
   } catch (e) {
      if (canHandle == true) {
         handleIt();
      } else {
         throw e;
      }
   }
}

theCondition が false であれば、関数は例外を投げます。その例外は JavaScript コードで受け取られ、さらに canHandle が true の場合に JavaScript はそれを処理します。canHandle false がならばその例外が再び投げられ、Java のハンドラがそれを受け取り、 doit メソッドが次の Java の文字列を返します:

JavaScript error occurred

JavaScript の例外についての詳細情報は例外処理文を参照してください。

後方互換性

JavaScript 1.3 以前のバージョンでは、JSException クラスには省略可能な文字列引数をとる 3 つの public タイプのコンストラクタがありました。この文字列引数は、詳細なメッセージやその例外に対する他の情報を指定するものです。getWrappedException メソッドは使用できませんでした。

次のような try...catch 文を使用することで、JavaScript 1.3 以前のバージョンで LiveConnect の例外を処理できます:

try {
   global.eval("foo.bar = 999;");
} catch (Exception e) {
   if (e instanceof JSException) {
      jsCodeFailed();
   } else {
      otherCodeFailed();
   }
}

この例では foo が定義されていないと eval 文が失敗します。try ブロックの eval 文が JSException を投げると、catch ブロックが jsCodeFailed メソッドを実行します。try ブロックがそれ以外のエラーを投げると、otherCodeFailed メソッドが実行されます。

データ型変換

Java は強く型付けされた言語であり、JavaScript は弱く型付けされた言語であるため、LiveConnect を使用する際はもう一方の言語のために、JavaScript ランタイムエンジンが引数の値を適切なデータ型に変換します。この変換について以下のセクションで説明します:

JavaScript から Java への変換

JavaScript から Java のメソッドを呼び出してパラメータを渡す際、渡すパラメータのデータ型は以下のセクションで説明するルールによって変換されます:

netscape.javascript.JSObject メソッドの戻り値は常に java.lang.Object のインスタンスに変換されます。このような戻り値の変換ルールもここで説明します。

例えば JSObject.eval が JavaScript の数値を返すのであれば、この数値を java.lang.Object のインスタンスに変換するルールは数値に記載されています。

数値

Java のメソッドに JavaScript の数値型をパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
double
  • そのままの値が、丸められたり絶対値や符号が損なわれることなく Java に渡されます。
  • NaNNaN に変換されます。
java.lang.Double
java.lang.Object
java.lang.Double の新しいインスタンスが作成され、そのままの値が、丸められたり絶対値や符号が損なわれることなく Java に渡されます。
float
  • 値は float 精度に丸められます。
  • 大きすぎまたは小さすぎて表現できない値は、正の無限大または負の無限大に丸められます。
  • NaNNaN に変換されます。
byte
char
int
long
short
  • 値は負の無限大方向に丸められます。
  • 大きすぎまたは小さすぎて表現できない値は、ランタイムエラーになります。
  • NaN は変換されずにランタイムエラーになります。
java.lang.String 値は文字列に変換されます。例えば:
  • 237 は "237" になります。
boolean
  • 0 および NaN は false に変換されます。
  • その他の値は true に変換されます。

java.lang.String のインスタンスをパラメータに想定した Java のメソッドに JavaScript の数値をパラメータとして渡すと、その数値は文字列に変換されます。equals() メソッドを使用すると、この変換結果と他の文字列を比較できます。

真偽値

Java のメソッドに JavaScript の真偽値型をパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
boolean すべての値は、Java で対応するものに直接変換されます。
java.lang.Boolean
java.lang.Object
java.lang.Boolean の新しいインスタンスが作成されます。同一のプリミティブ値に対して 1 つのインスタンスではなく、各パラメータについて新しいインスタンスが作成されます。
java.lang.String 値は文字列に変換されます。例えば:
  • true は "true" になります。
  • false は "false" になります。
byte
char
double
float
int
long
short
  • true は 1 になります。
  • false は 0 になります。

java.lang.String のインスタンスをパラメータに想定した Java のメソッドに JavaScript の真偽値をパラメータとして渡すと、その真偽値は文字列に変換されます。== 演算子を使用すると、この変換結果と他の文字列を比較できます。

文字列値

Java のメソッドに JavaScript の文字列型をパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
java.lang.String
java.lang.Object
JavaScript 1.4:
  • JavaScript の文字列は、Unicode 値で java.lang.String のインスタンスに変換されます。

JavaScript 1.3 以前:

  • JavaScript の文字列は、ASCII 値で java.lang.String のインスタンスに変換されます。
byte
double
float
int
long
short
すべての値は、ECMA-262 に記載に従って数値に変換されます。JavaScript の文字列値は ECMA-262 に記載されたルールに従って数値に変換されます。
char JavaScript 1.4:
  • 1 文字の文字列は、Unicode 文字に変換されます。
  • 他のすべての値は数値に変換されます。

JavaScript 1.3 以前:

  • すべての値が数値に変換されます。
boolean
  • 空文字列は false になります。
  • 他のすべての値は true になります。

undefined 値

Java のメソッドに JavaScript の undefined 値をパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
java.lang.String
java.lang.Object
値は java.lang.String のインスタンスに変換され、インスタンスの値は文字列 "undefined" になります。
boolean 値は false になります。
double
float
値は NaN になります。
byte
char
int
long
short
値は 0 になります。

undefined 値の変換は JavaScript 1.3 以降でのみ可能です。それより古いバージョンでは、undefined 値がサポートされていません。

java.lang.String のインスタンスをパラメータに想定した Java のメソッドに JavaScript の undefined 値をパラメータとして渡すと、その undefined 値は文字列に変換されます。== 演算子を使用すると、この変換結果と他の文字列を比較できます。

null 値

Java のメソッドに JavaScript の null 値をパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
あらゆるクラス
あらゆるインタフェースの種類
値は null になります。
byte
char
double
float
int
long
short
値は 0 になります。
boolean 値は false になります。

JavaArray および JavaObject オブジェクト

ほとんどの場合、Java のメソッドに JavaScript の JavaArray または JavaObject オブジェクトをパラメータとして渡すと、Java は単にそのオブジェクトのラップを解きます。そうでない場合は、Java は次の表で示すルールに従ってそのオブジェクトを別のデータ型に変換します:

Java のパラメータ型 変換ルール
ラップが解かれたオブジェクトと代入互換性のある、あらゆるインタフェースまたはクラス オブジェクトのラップが解かれます。
java.lang.String オブジェクトのラップが解かれ、ラップが解かれた Java オブジェクトの toString メソッドが呼び出され、その結果が java.lang.String の新しいインスタンスとして返されます。
byte
char
double
float
int
long
short
オブジェクトのラップが解かれ、次の状況のどちらかが起こります:
  • ラップが解かれた Java のオブジェクトに doubleValue メソッドがあれば、JavaArray または JavaObject はこのメソッドが返す値に変換されます。
  • ラップが解かれた Java オブジェクトに doubleValue メソッドがなければ、エラーが発生します。
boolean JavaScript 1.3 以降ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:
  • オブジェクトが null ならば、false に変換されます。
  • オブジェクトがそれ以外の値ならば、true に変換されます。

JavaScript 1.2 以前ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:

  • ラップが解かれたオブジェクトに booleanValue メソッドがあれば、ソースオブジェクトは戻り値のために変換されます。
  • オブジェクトに booleanValue がなければ、変換に失敗します。

ラップが解かれたオブジェクトが Java のパラメータ型のインスタンスであれば、インタフェースまたはクラスが、ラップが解かれたオブジェクトと代入互換性があるということです。つまり、次の文は必ず true を返します:

unwrappedObject instanceof parameterType;

JavaClass オブジェクト

Java のメソッドに JavaScript の JavaClass オブジェクトをパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
java.lang.Class オブジェクトのラップが解かれます。
netscape.javascript.JSObject
java.lang.Object
JavaClass オブジェクトが netscape.javascript.JSObject の新しいインスタンス内にラップされます。
java.lang.String オブジェクトのラップが解かれ、ラップが解かれた Java オブジェクトの toString メソッドが呼び出され、その結果が java.lang.String の新しいインスタンスとして返されます。
boolean JavaScript 1.3 以降ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:
  • オブジェクトが null ならば、false に変換されます。
  • オブジェクトがそれ以外の値ならば、true に変換されます。

JavaScript 1.2 以前ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:

  • ラップが解かれたオブジェクトに booleanValue メソッドがあれば、ソースオブジェクトは戻り値のために変換されます。
  • オブジェクトに booleanValue がなければ、変換に失敗します。

その他の JavaScript のオブジェクト

Java のメソッドに JavaScript のその他のオブジェクトをパラメータとして渡すと、Java は次の表で示すルールに従ってその値を変換します:

Java のパラメータ型 変換ルール
netscape.javascript.JSObject
java.lang.Object
オブジェクトは netscape.javascript.JSObject の新しいインスタンス内にラップされます。
java.lang.String オブジェクトのラップが解かれ、ラップが解かれたオブジェクトの toString メソッドが呼び出され、その結果が java.lang.String の新しいインスタンスとして返されます。
byte
char
double
float
int
long
short
オブジェクトは、ECMA-262 に記載された ToPrimitive 演算子のロジックを使用して値に変換されます。この演算子で使用される PreferredType ヒントは Number です。
boolean JavaScript 1.3 以降ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:
  • オブジェクトが null ならば、false に変換されます。
  • オブジェクトがそれ以外の値ならば、true に変換されます。

JavaScript 1.2 以前ではオブジェクトのラップが解かれ、次の状況のどちらかが起こります:

  • ラップが解かれたオブジェクトに booleanValue メソッドがあれば、ソースオブジェクトは戻り値のために変換されます。
  • オブジェクトに booleanValue がなければ、変換に失敗します。

Java から JavaScript への変換

Java から JavaScript に渡された値は、次のように変換されます:

  • Java の byte、char、short、int、long、float および double は、JavaScript の数値に変換されます。
  • Java の boolean は、JavaScript の真偽値に変換されます。
  • クラス netscape.javascript.JSObject のオブジェクトは、元の JavaScript のオブジェクトに変換されます。
  • Java の配列は JavaScript の擬似的な Array オブジェクトに変換されます。このオブジェクトは JavaScript の Array オブジェクトと全く同じような挙動をとります。つまり、arrayName[index] (index は整数) という構文でそれにアクセスでき、その長さを arrayName.length で判断できます。
  • Java のそれ以外オブジェクトは、JavaScript のラッパに変換されます。このラッパを通じて Java のオブジェクトのメソッドやフィールドにアクセスできます:
    • このラッパから文字列への変換では、元のオブジェクトで toString メソッドが呼び出されます。
    • 数値への変換では、可能であれば doubleValue メソッドが呼び出され、そうでなければ失敗します。
    • JavaScript 1.3 以降の真偽値への変換では、そのオブジェクトが null であれば false が、そうでなければ true を返します。
    • JavaScript 1.2 以前の真偽値への変換では、可能であれば booleanValue メソッドが呼び出され、そうでなければ失敗します。

java.lang.Double および java.lang.Integer のインスタンスは、JavaScript の数値ではなく JavaScript のオブジェクトに変換されることに注意してください。同様に java.lang.String のインスタンスも、JavaScript の文字列ではなく JavaScript のオブジェクトに変換されます。

Java の String オブジェクトも、JavaScript のラッパに相当します。JavaScript の文字列を必要とする JavaScript のメソッドを、このラッパを渡して呼び出すとエラーになります。そうではなく、次のようにラッパに空文字列を付加することで、ラッパを JavaScript の文字列に変換してください:

var JavaString = JavaObj.methodThatReturnsAString();
var JavaScriptString = JavaString + "";

ドキュメントのタグと貢献者

 このページの貢献者: ethertank, yyss, happysadman, Electrolysis, Mgjbot
 最終更新者: ethertank,