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