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 ではしない。JavaScript(Rhino)自身のトップレベルオブジェクトである 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]