Groovyとクラスローダ
ちょっとツールを作る機会があったんで、さっそくプラグインの設定ファイルをGroovyでDSLしてみた。プラグイン読み込み用に、pluginsディレクトリの下のjarをかたっぱしから読み込んで、jarの中から設定を読んで初期化するクラスローダを作ったんだけど、デバッグしていてびっくり。例えば、FieldAnalyzerPluginクラスをロードしようとすると、
java.lang.FieldAnalyzerPlugin java.io.FieldAnalyzerPlugin java.net.FieldAnalyzerPlugin java.util.FieldAnalyzerPlugin groovy.lang.FieldAnalyzerPlugin groovy.util.FieldAnalyzerPlugin
を、えんえんとロードしようとするんだね。たしかに、これらのパッケージのクラスは、importしなくても使える仕様になっているんで、クラスローダ部分で解決しているわけだ。これ、パッケージ無しだから、まだいんんだけど、パッケージありのクラスだと、更に激しい。com.ruimo.FieldAnalyzerなんかは、上記に加えて
com$ruimo$FieldAnalyzerPlugin com.ruimo$FieldAnalyzerPlugin com.ruimo.FieldAnalyzerPlugin
を試すようだ。この$付きが、何に使用されているのかは、まだ不明。まぁ、一回ロードしてしまえばキャッシュされてしまうんで、パフォーマンス上の大きな問題にはならないようだけど、でも、これって優先順位を考えると、自分が使っているクラスと同じ名前のクラスが、将来java.utilとかに追加されてしまったら、Groovyでは使えなくなっちゃうってことだよね。それは困るなぁ。
P.S. と思ったけど、明示的にimportしていれば、そちらが使われるみたいだ。





