久しぶりにCDとか見にいったとです。
「お、懐かしー、このCD再発されたんだ」とか思って、手にとって見てみると、『ボーナストラック10曲追加』。
……。
いや、あの、これって、もともとは6曲しか入ってないアルバムなんですが……。
ボーナストラックの方が多いだろと。もう、それならいっそ新譜として出せと。
やまだです。相変わらず投げっぱなしの前文です。
ふんっ、Tech・Ed なんか行けなくたって、悲しくなんかないもんっ、と虚勢をはる今日この頃だったりします。
で、前月の続きなんですが、ちょっとコンスタントープールをざっくり解説など。
……とはいっても、基本的に「その他のデータ(その1)」なんですよね。雑多なデータの集まり。
#やっぱり図が前月の使い回しですw
では先頭のエントリから見ていきましょうか。CONSTANT_Methodref、これは文字通りメソッド定義です。
で、その構成要素が、10 と 25。じゃあ、10番目は何かというと CONSTANT_Class、クラスですな。25番目は Constant_NameAndType つまり名前と型。
要するに、コンスタントプールのメソッド定義は、それが属するクラスと、名前と型から成っていますと。
で、この 10 番目のエントリ CONSTANT_Class にはデータとして何が入っているかというと、31。31番目を見ろということになります。
そこにあるのは CONSTANT_UTF8、つまり UTF8 形式で文字列が入ってます。じゃあ他の文字コードにも対応しているのか、ということになりますが UTF8 以外のタグは(少なくとも公式では)定義されていないようです。
で、その中身は、java/lang/Object これは、java.lang.Object クラスってことですな。なぜかパッケージのセパレータ文字が変わってたりします。
25番目の NameAndType を見ると、さらに 17 番目と 18 番目を見ろと。それぞれはやはり文字列。前者がメソッド名を示し、後者が型を示します。
ということで、このメソッド名は <init>。これはコンストラクタの内部名です。これと衝突しないように、Java では <init> メソッドは予約語扱いでソースコード上では記述できないようになっています。同様に、クラスの初期化メソッドは <clinit> という内部名になります。
で、型は ()V。()内に何もないので、引数はなし。()の後にあるのが、返値の型でVは Void を表しています。
では、引数がある場合はどう表現するんだと。その場合は22番目にあるような形になります。[ は配列を表し、Lはその後;までクラス名がつながります。
という形に、一か所からずるずるとその他の情報がぶら下がっている形になっているわけです。
というわけで、命令側からは一か所指定しとけば、そこからいくらでも必要な情報は辿っていけるということになるわけですが、今回はこの辺で。
#えーと、ある意味今更な解説なので、今後続くかどうかは、私の気分と、誰かからクレームがつくかどうかで決まります?
では。