gcjのクラス(java.lang.Class)にまつわる資料

[Coins Java - データ構造]

データ構造


以下のような構造を持つ

構造を簡単に紹介する。

メンバ名 型/サイズ 備考
(vtable) ポインタ java.lang.ClassVTable
next ポインタ クラスプールの次のクラスへのポインタ
name ポインタ クラスの名前 (通常の完全参照名)
accflags 16bit アクセスフラグ
superclass ポインタ 親クラス( java.lang.Classインスタンス)
constants 構造体 コンスタントプール
methods ポインタ このクラスで宣言したメソッドのテーブル
method_count 16bit このクラスで宣言したメソッドの個数
vtable_method_count 16bit VTableに格納されているメソッドの個数
fieldlist ポインタ このクラスで宣言したフィールドのリスト
size_in_bytes 32bit インスタンスの大きさ(フィールドサイズ+padding+4)
field_count 16bit このクラスで宣言したフィールドの個数
static_field_count 16bit このクラスで宣言したクラスフィールドの個数
vtable ポインタ このクラスのVTable
otable ポインタ 各メソッドのVTable上に配置されるメソッドのインデックスを格納したテーブル
otable_syms ポインタ 上記テーブルのシグネチャを記録したテーブル
interfaces ポインタ このクラスが実装するすべてのインタフェース
loader ポインタ このクラスをロードしたjava.lang.ClassLoaderのインスタンス
interface_count ポインタ インターフェースの個数
state 8bit クラスの状態(ロード中など)
thread ポインタ このクラスをロックしているスレッド
depth 16bit java.lang.Objectから何代目かを表す
ancestors ポインタ 直接/間接スーパークラスを列挙した配列
idt ポインタ このクラスのITable
arrayclass ポインタ このクラスの配列型を表す java.lang.Classインスタンス
protectionDomain ポインタ 不明
chain ポインタ スタックトレースに利用される領域

コンスタントプール

以下のような構造を持つ

構造を簡単に紹介する。

メンバ名 型/サイズ 備考
size 16bit コンスタントプールの要素数(未使用の0番も含まれる)
tags 8bit * size コンスタントプールの各要素のタグ
data ポインタ * size コンスタントプールの各要素

メソッドテーブル


以下のような構造を持つ


構造を簡単に紹介する。

メンバ名 型/サイズ 備考
name ポインタ メソッド名を表す
signature ポインタ メソッドディスクリプタを表す
accflags 16bit アクセスフラグ
index 16bit VTable上でのインデックス
ncode 関数ポインタ メソッドの実体
throws ポインタ スローする例外

*VTableに格納されないメソッドは index = -1 となる。

フィールドリスト


以下のような構造を持つ


構造を簡単に紹介する。

メンバ名 型/サイズ 備考
name ポインタ フィールド名を表す
type ポインタ フィールドの型(java.lang.Classインスタンス)を表す
flags 16bit アクセスフラグ + 解決済みフラグ
bsize 16bit このフィールドのサイズ
addr/offset ポインタ クラスフィールドならアドレス、インスタンスフィールドならオフセットを表す

* フィールドの型がプリミティブの場合 _Jv_##TYPE##Class という名前の外部シンボルを使用すればよい
* フィールドのサイズは、コンパイルオプションによって豪快に変わるかもしれない

Copyright (C) 2002-2006 s.arakawa