!import文はどこへ? OpenJDK6の話. Javaのクラス定義は,JCClassDeclというJCTreeのサブクラスで管理されている. インスタンス変数は,このクラスの中のどこかにぶらさがっていて, それが何のクラスのインスタンスかっていうのは,メソッドでとりだすことができる. 一方,メソッド呼び出しは,JCMethodDeclのインスタンスとして管理されているのだけど どうもこのインスタンスからは,メソッド呼び出しのレシーバがだれなのか, を取り出せない...ようにみえる. インスタンス変数ならば,シンボルテーブルみたいなものを辿れば,探せるけど, (実際,静的に探そうとするとエイリアスの問題があって厄介だけど) そもそもstaticなメソッドであれば,どこかに誰かがクラスパスをもっていないといけないはず.... でもJCClassDeclには,ない. でみてみると,com.sun.tools.javac.main.JavaCompiler.javaでは, JavaFileObject genCode(Env env, JCClassDecl cdef) throws IOException { ... } として,JCClassDeclとは別にEnvのインスタンスでクラス自身のパスや import文をもっているということがわかった. for(Symbol s: env.outer.info.getLocalElements()){ System.out.println(s); } とりあえず,こんな感じで取り出せる. よく考えれば(よく考えなくても),たしかに,import文ってクラスの外で定義してあるよね. これで,やっとstaticなメソッド呼び出しのパス検索をごにょごにょできる.よかった. ちなみに,これは,OpenJDK6の話...OpenJDK7ではどうなっているのか. そろそろJavaRockも7ベースに移行することを考えるか...