配列クラスは以下の契機で作成される.
プリミティブ型の1次元配列のクラスは, HotSpot の起動時に生成される.
その他の配列クラスは, そのクラスが初めて使用される際に生成される (#TODO).
作成された配列クラスは, それぞれ以下のフィールドから参照されている
Universe クラス内のフィールドから参照されている (See: Universe::typeArrayKlassObj()) * オブジェクト型の1次元配列のクラス: (objArrayKlass オブジェクト)
対応する instanceKlass オブジェクトの _array_klasses フィールドから参照されている. * 2次元以上の配列クラス: (objArrayKlass オブジェクト)
次元が1つ下の配列クラスの arrayKlass::_higher_dimension フィールドから参照されている.
配列クラスの取得処理 (Klass::array_klass()) では, 上記 arrayKlass::_higher_dimension フィールドを用いて再帰的に探索が行われる. (まず 1次元配列のクラスから開始し, arrayKlass::_higher_dimension を辿って指定の次元数に達するまで配列クラスを辿る. 途中で未作成の配列クラスがあれば作成する処理も行われる).
(HotSpot の起動時処理) (See: here for details) -> Threads::create_vm() -> init_globals() -> universe2_init() -> Universe::genesis() -> typeArrayKlass::create_klass(BasicType type, int scale, TRAPS) -> typeArrayKlass::create_klass(BasicType type, int scale, const char* name_str, TRAPS) -> (1) 新しい typeArrayKlass オブジェクトを生成する -> arrayKlass::base_create_array_klass() -> Klass::base_create_klass() -> Klass::base_create_klass_oop() -> Klass_vtbl::allocate_permanent(KlassHandle& klass, int size, TRAPS) (を各サブクラスがオーバーライドしたもの) -> (1) 新しい Klass クラス (のサブクラス) オブジェクトを確保 (1) 確保した klassOop の klass フィールドを初期化 -> Klass_vtbl::post_new_init_klass() -> CollectedHeap::post_allocation_install_obj_klass() (1) 生成した配列クラスの vtable や mirror オブジェクト (Java レベルのクラスオブジェクト) を生成する. -> arrayKlass::complete_create_array_klass() -> Klass::initialize_supers() -> klassVtable::initialize_vtable() -> java_lang_Class::create_mirror()
(See: here for details) -> SystemDictionary::resolve_or_null(Symbol *class_name, Handle class_loader, Handle protection_domain, TRAPS) -> * ロード対象が配列クラスの場合: -> SystemDictionary::resolve_array_class_or_null() -> * オブジェクト型の配列クラスの場合: (一次元配列のクラスだけでなく, 多次元配列のクラスも含む) -> (1) 要素であるオブジェクト型のクラス(instanceKlass)を取得する -> SystemDictionary::resolve_instance_class_or_null() -> (See: here for details) (1) 取得したinstanceKlassを基に配列クラスを取得する -> Klass::array_klass() -> instanceKlass::array_klass_impl() -> (1) まだ作成してなければ, 一次元配列クラスを作成する -> objArrayKlassKlass::allocate_objArray_klass() -> objArrayKlassKlass::allocate_objArray_klass_impl() -> arrayKlass::base_create_array_klass() -> (同上) (1) 対応する次元の配列クラスを取得する -> Klass::array_klass() (再帰呼び出し) -> objArrayKlass::array_klass_impl() -> (1) 引数の次元数が一致すれば, それをリターン (1) まだ作成してなければ, 1つ高次元の配列クラスを作成する -> objArrayKlassKlass::allocate_objArray_klass() -> (同上) (1) 1つ高次元の配列クラスに対して再帰呼び出し -> Klass::array_klass() (再帰呼び出し) -> objArrayKlass::array_klass_impl() -> (以下, 繰り返し) * プリミティブ型の配列クラスの場合: (一次元配列のクラスだけでなく, 多次元配列のクラスも含む) -> (1) プリミティブ型の1次元配列クラスを取得する -> Universe::typeArrayKlassObj() (1) 取得した配列クラスから配列クラスを取得する -> Klass::array_klass() -> typeArrayKlass::array_klass_impl() -> (1) 引数の次元数が一致すれば, それをリターン (1) まだ作成してなければ, 配列クラスを作成する. -> objArrayKlassKlass::allocate_objArray_klass() -> (同上) (1) 再帰呼び出しにより, 対応する次元の配列クラスを取得する -> Klass::array_klass() (再帰呼び出し) -> objArrayKlass::array_klass_impl() -> (同上)
jni_NewObjectArray() -> Klass::array_klass() -> (同上)
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
(#Under Construction) See: here for details
(#Under Construction)
(#Under Construction) See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.