トップ 一覧 Farm 検索 ヘルプ RSS ログイン

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ベースに移行することを考えるか...