himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

Accessing Java packages and classes

Java の code は class の一部で、Java class は package の一部だ。つまり Java の code は必ず何れかの package に含まれる。一方 JavaScript では script はあらゆる package の外にも存在する。
JavaScriptからJavaパッケージの中のクラスにアクセスする方法は?
Rhino(jrunscript)では Packages グローバル変数が定義されており、変数 Packages の properties はすべて java や com などトップレベJava パッケージ。Java のパッケージおよびクラスをインポートするため、組み込み関数 importPackage 及び importClass が使える。Packages グローバル変数を使えば Java パッケージを参照できる。

Packages.java.util.Vector、Packages.javax.swing.JFrame

・"java" は "Packages.java" のショートカット。
・javax、org、edu、com、net 接頭辞に等価のショートカットがあるため、実際上すべての JDK プラットフォームクラスは "Packages" 接頭辞なしで参照可。
JavaScript の組み込みの Object、Boolean、Math などと競合するため、java.lang は、Java とは異なりデフォルトではインポートされない。
・importPackage および importClass 関数が JavaScriptグローバル変数スコープを「煩雑」にするのを回避するために、JavaImporter を使える。

// create JavaImporter with specific packages and classes to import

var SwingGui = new JavaImporter(javax.swing,
                            javax.swing.event,
                            javax.swing.border,
                            java.awt.event);
with (SwingGui) {
    // within this 'with' statement, we can access Swing and AWT
    // classes by unqualified (simple) names.

    var mybutton = new JButton("test");
    var myframe = new JFrame("test");

例)

js> Packages.java
[JavaPackage java]

・パッケージ階層構造を辿り、Javaのクラスにアクセスすることができる

js> java.io.File
class java.io.File

・様々なJavaのクラスにアクセスする際、毎回クラスの完全なパッケージ名を使用するのは面倒なので Rhino(jrunscript)では Java の import 宣言と同じ目的に使えるトップレベル関数 importPackage が提供されている
・例えば java.iopackage とクラス java.io.File 使用におけるクラスのすべてを名前 File としてインポートできる

js> importPackage(java.io)
js> File
class java.io.File

・importPackage(java.io)によって java.io package のすべてのクラスに(File として)トップレベルから参照可能。つまり Javaで import java.io*; を宣言するのと同じ。
・既に書いたように Java では暗黙のうちに java.lang* をインポートするが、Rhino ではしない。JavaScriptRhino)自身のトップレベルオブジェクトである Boolean, Math, Number, Object, String は java.langパッケージで定義された同じ名前とは異なる。この競合を避けるため importPackage で java.lang を import すべきではない。
・誤った Java パッケージやクラス名を指定した場合の Rhino の振る舞いに注意!。
 java.MyClass を参照すると、Rhino はまず java.MyClassというクラスの読み込みを試みる。
 これに失敗すると java.MyClass がパッケージ名であると仮定し error については全く報告しない

js> java.MyClass
[JavaPackage java.MyClass]