プログラミングについてのWiki。

binsummer2012

クラスファイル構成

(原本) Chapter 4. The class File Format http://docs.oracle.com/javase/specs/jvms/se7/html/...

の一部分を適当訳。誤訳注意!!!

java の class file は 8-bit byte の連続を基礎としてる。16-bit、32-bit、64-bit も、連続した 8-bit byte で構成される。
複数バイトのデータはいつもビッグエンディアンで(クラスファイルに)格納されます。

この章ではクラスファイルデータを表すのに、この章独自のデータ型セットを定義します。それは符号なしで、各々:
u1 => one-byte
u2 => two-byte
u4 => four-byte
のbyte量を表します。

この章はC言語風構造体表記の疑似構造体書式を使って、クラスファイルを紹介します。
クラスのフィールドやクラスのインスタンスなどにともなった混乱を避けるため、クラスファイル書式の構造体の内容は要素といって言及します。
クラスファイル内で順に連続している要素は、パディングやアラインメントなしで格納されています。
テーブルは0から可変の個数の要素で構成されるもので、幾つかのクラスファイル構成で使われています。
私たちはC言語風配列構文でテーブル要素を言及するけど、実際のところ、可変個数のバイト列では、テーブルのインデックスから直接テーブルのバイトオフセット値に変換するのは不可能ということになります。
私たちがデータ構造を配列として言及するところでは、そのデータ構造は0個か連続した固定長の要素からなるもので、配列のようにインデックスでアクセスできるものです。

(原本) 4.1. The ClassFile Structure http://docs.oracle.com/javase/specs/jvms/se7/html/...

の適当訳。誤訳注意!!!
 ClassFile {
     u4             magic;                                  // magic要素はクラスファイルの書式を限定するマジックナンバーが与えられていて、
                                                            // "0xCAFEBABE" という値を持っています。
     u2             minor_version;                          // +-- クラスファイルのバージョン。JVMから見てこのクラスファイルをJVMがサポートできるか分かる。
     u2             major_version;                          // |
     u2             constant_pool_count;                    // constant_pool_count要素は下の constant_pool テーブルが持つ項目数「足す1」の値。
                                                            // constant_pool テーブルにアクセスするときの index 値は 「0 < "index 値" < constant_pool_count」
                                                            // の範囲にあるのが有効と見なされる。
                                                            // long と double の特別な扱いについては、4.4.5 に記述があります。  
     cp_info        constant_pool[constant_pool_count-1];   // constant_pool はいろんな string の固定値を表現する構造体(4.4.) のテーブル。
                                                            // 例えば、 class名、interface名、field名など。
                                                            // そのテーブルの内容はそのクラスファイル構成やサブクラスファイル構成の中で参照されます。
                                                            // constant_pool テーブルの項目がどのフォーマットかは、その項目の1byte目にくる「タグ」バイトによって、
                                                            // 分かります。
     u2             access_flags;                           // access_flags要素はclassやinterfaceのパーミッションやら属性を説明するためのフラグ。
                                                            // Table 4.1 に簡単な説明。もっと詳しい説明はリンク先を参照して下さい。
     u2             this_class;                             // this_class要素の値はconstant_poolテーブルの項目を指すのに有効なインデックスであること。
                                                            // そのインデックスが指す constant_poolテーブルの項目は、このクラスファイルで定義されている、
                                                            // クラスまたはインタフェースを表現するCONSTANT_Class_info構造体(4.4.1.)であること。
     u2             super_class;                            // クラスの場合、super_class要素の値はゼロかconstant_poolテーブルの項目を指すのに有効なインデックスであること。
                                                            // super_class要素がゼロじゃないなら、そのインデックスが指すconstant_poolテーブルの項目は
                                                            // このクラスファイルで定義されているクラスの直接のスーパークラスを表す、
                                                            // CONSTANT_Class_info構造体(4.4.1.)であること。
                                                            // 直接のスーパークラスやスーパークラスのいずれもClassFile構造に、ACC_FINALフラグが有効なaccess_flags要素を、
                                                            // 持ってはならない。
                                                            // super_class要素がゼロだったら、このクラスファイルは class Object を表し、唯一、class と interface だけには
                                                            // 直接スーパークラスがない。
                                                            // インターフェースの場合、super_class要素の値はいつもconstant_poolテーブルの項目を指すのに有効なインデックスであること。
                                                            // そのインデックスが指すconstant_poolテーブルの項目は、class Object を表す、
                                                            // CONSTANT_Class_info構造体(4.4.1.)であること。
     u2             interfaces_count;
     u2             interfaces[interfaces_count];
     u2             fields_count;
     field_info     fields[fields_count];
     u2             methods_count;
     method_info    methods[methods_count];                 // メソッドテーブル(多分、この項目のこと)のそれぞれの値は、このクラスかインターフェースにあるメソッドの、
                                                            // 完全な記述を提供するmethod_info (4.6.) 構造体であること。
                                                            // もしmethod_info構造体にあるaccess_flags要素に、ACC_NATIVEかACC_ABSTRACTが有効にされてたたら、
                                                            // そのメソッドの実装のJava virtual machine 命令は同様に与えられる。
                                                            // method_info構造体は、このクラスやインターフェースの型で宣言されている全てのメソッドを表現します。
                                                            // それはインスタンスメソッド、クラスメソッド、インスタンス初期化メソッド(2.9.),そしてクラスやインターフェースの
                                                            // いずれの初期化メソッドも。(2.9.)
                              // メソッドテーブルには継承したスーパークラスやスーパーインターフェースのメソッドの要素は含まれません。
     u2             attributes_count;
     attribute_info attributes[attributes_count];
 }

(リンク)
4.4.5. The CONSTANT_Long_info and CONSTANT_Double_info Structures http://docs.oracle.com/javase/specs/jvms/se7/html/...
4.4. The Constant Pool http://docs.oracle.com/javase/specs/jvms/se7/html/...
4.4.1. The CONSTANT_Class_info Structure http://docs.oracle.com/javase/specs/jvms/se7/html/...

(原本) http://docs.oracle.com/javase/specs/jvms/se7/html/...
の適当訳。誤訳注意!!!
Table 4.1. Class access and property modifiers
Flag NameValue説明
ACC_PUBLIC0x0001public と宣言される。きっとこれのあるパッケージの外からアクセスされるんでしょう。
ACC_FINAL0x0010final と宣言される。サブクラスを派生するのだめ。
ACC_SUPER0x0020特に invokespecial 命令で呼ばれたら、スーパークラスのメソッドとして扱うよ。
ACC_INTERFACE0x0200interface であって、class じゃないさ。
ACC_ABSTRACT0x0400abstract と宣言される。インスタン化はだめ。
ACC_SYNTHETIC0x1000synthetic と宣言される。(多分、コンパイラとかが生成したコードだから)ソースコード中にはないよ。
ACC_ANNOTATION0x2000annotation type として宣言される。
ACC_ENUM0x4000enum type として宣言される。

4.3.3. Method Descriptors http://docs.oracle.com/javase/specs/jvms/se7/html/...

A method descriptor represents the parameters that the method takes and the value that it returns:
メソッド記述はメソッドが取るパラメータとメソッドが返す値を表現します。
MethodDescriptor:
    ( ParameterDescriptor* ) ReturnDescriptor

A parameter descriptor represents a parameter passed to a method:
パラメータ記述はメソッドに渡されるパラメータを表現します。
ParameterDescriptor:
    FieldType

A return descriptor represents the type of the value returned from a method. It is a series of characters generated by the grammar:
戻り記述はメソッドから戻る値の型を表現します。それは文法によって生成される一組のの文字列です。

ReturnDescriptor:
    FieldType
    VoidDescriptor

VoidDescriptor:
    V

The character V indicates that the method returns no value (its return type is void).
文字 V はメソッドが値を返さないことを意味します。(その戻り値型はvoid)

A method descriptor is valid only if it represents method parameters with a total length of 255 or less, where that length includes the contribution for this in the case of instance or interface method invocations. The total length is calculated by summing the contributions of the individual parameters, where a parameter of type long or double contributes two units to the length and a parameter of any other type contributes one unit.

この長さはインスタンスメソッドやインターフェースメソッドの呼び出しの場合において寄与するのを含むところで、
このメソッド記述は、それが表現するメソッドパラメータが全長が255かそれ未満において、有効です。

longとdouble型のパラメータは2ユニットがその長さに、その外の型のパラメータでは1ユニットが寄与するところで、
全長は個々のパラメータの寄与が合計されることによって計算されます。
# さっぱり分からない orz

For example, the method descriptor for the method
例えば、そのメソッドのためのメソッド記述
Object mymethod(int i, double d, Thread t)

is
は

(IDLjava/lang/Thread;)Ljava/lang/Object;

Note that the internal forms of the binary names of Thread and Object are used in the method descriptor.
メソッド記述内でThreadとObjecのバイナリ名の内部フォームが使われているということを指摘しておきます。
The method descriptor for mymethod is the same whether mymethod is a class or an instance method.
mymethodのメソッド記述はmymethodがクラスメソッドでもインスタンスメソッドでも同じです。

Although an instance method is passed this, a reference to the current class instance, in addition to its intended parameters, that fact is not reflected in the method descriptor.
けれどインスタンスメソッドがthisを渡される、現在のクラスインスタンスへの参照(であるthis)、もっと言えばその意図されたパラメータ(であるthis)、という事実はメソッド記述の中に反映されません。
(A reference to this is not passed to a class method.)
(this への参照はクラスメソッドに渡されません。)
The reference to this is passed implicitly by the method invocation instructions of the Java virtual machine used to invoke instance methods.
Java仮想マシンがインスタメソッドを呼び出すのに使うメソッド呼び出し命令によって、thisへの参照は暗黙に渡されます。

Wiki内検索

Menu

ここは自由に編集できるエリアです。

管理人/副管理人のみ編集できます