<< 2008/01/22 | Home | 2008/01/24 >>
PR: 転職    転職    合宿免許    漫画    シルバー    ブライダルエステ    墓地・霊園    葬式   

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していれば、そちらが使われるみたいだ。

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8