- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!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ベースに移行することを考えるか...