Jython を学ぶ(6)───JAR ファイルを動的にロードする

前回の記事で、 batik.jar をクラスパスに入れる時に環境変数を使わなければならなかったのが良くなかったので、JAR ファイルを動的ロードすることにします。

Java では煩雑なリフレクション API を使わなければならないのですが、動的型付けかつ動的言語である Python では全てがリフレクションのようなものです。
実際、 Jython では普通に import したクラスのメソッドもリフレクション API で呼び出されていると思います。

例:

#! jython
# dload.py
from java.io import File
from java.net import URL
from java.net import URLClassLoader
import jarray
urlClassLoader=URLClassLoader(jarray.array([File("batik.jar").toURL()], URL))
JSVGCanvas=urlClassLoader.loadClass("org.apache.batik.swing.JSVGCanvas")
#以下、JSVGCanvas を普通に import した場合と同じように使える
print JSVGCanvas
jsvgCanvas=JSVGCanvas()
print jsvgCanvas.toString()
# ... 

カレントディレクトリに batik.jar を置いて、

jython dload.py


六行目が少しわかりにくいかもしれません。
URLClassLoader のコンストラクタは JAR ファイルまたはディレクトリの URL の配列を引数にとります。
このクラスローダは引数に指定された URL からクラスとリソースを検索します。


ClassLoader#loadClass で指定した名前のクラスオブジェクトを得ることができます。
ここで Java ならリフレクション API でこのクラスオブジェクトを使う羽目になるのですが、Jython では普通に import した場合と同じように使えます。


今後この日記に載せる Jython プログラムでは標準ライブラリ以外の JAR ファイルは全て動的にロードしようと思います。