初期のJDK 1.0から7前後までJava VMのソースコードを読んでいましたが、java.lang.Object はその第1フィールドに「private Class _class」のようなフィールドを概念的に持っています。これは他の JVM でも同様だと思います。そしてオブジェクト(java.lang.Object)が生成される時に、_classフィールドに Class オブジェクトの参照が fill されるように動作します。 # Hotspot VM の実際の実装は _class に相当するフィールドはもっと複雑な構造をしていますが。
java.lang.Object → java.lang.Class → java.lang.ClassLoader という参照関係があり、オブジェクト指向で言うところの「A has B」という関係があるの「オブジェクトはクラスに所属し、クラスはクラスローダ―に所属する」と言えると考えています。
こう書くと java.lang.Object を継承しているはずの java.lang.Class や java.lang.ClassLoader は、そのオブジェクト生成時に Class も ClassLoader もないのにどうやって生成できるのか疑問に思われると思いますが、クラスファイルを読み込んで作られるのではなく JVM 起動時に自動生成されます。そういう点も踏まえて「Bootstrap Class Loader」という特別なクラスローダ―が用意されているわけです。
Javaの文法上のクラスはjava.lang.Classのオブジェクトと1対1に対応しているので、私は「文法上のクラス=java.lang.Classのインスタンス」と考えています。そう考えると異なるクラスローダ―上にある同名のクラスの扱いがうまく整理できるからです。
初期のJDK 1.0から7前後までJava VMのソースコードを読んでいましたが、java.lang.Object はその第1フィールドに「private Class _class」のようなフィールドを概念的に持っています。これは他の JVM でも同様だと思います。そしてオブジェクト(java.lang.Object)が生成される時に、_classフィールドに Class オブジェクトの参照が fill されるように動作します。
# Hotspot VM の実際の実装は _class に相当するフィールドはもっと複雑な構造をしていますが。
java.lang.Object → java.lang.Class → java.lang.ClassLoader という参照関係があり、オブジェクト指向で言うところの「A has B」という関係があるの「オブジェクトはクラスに所属し、クラスはクラスローダ―に所属する」と言えると考えています。
こう書くと java.lang.Object を継承しているはずの java.lang.Class や java.lang.ClassLoader は、そのオブジェクト生成時に Class も ClassLoader もないのにどうやって生成できるのか疑問に思われると思いますが、クラスファイルを読み込んで作られるのではなく JVM 起動時に自動生成されます。そういう点も踏まえて「Bootstrap Class Loader」という特別なクラスローダ―が用意されているわけです。
大変参考になりました。ありがとうございます。
一点だけ、
「オブジェクト(java.lang.Object) がクラス(java.lang.Class) に所属するように」
ObjectがClassに属しているのでしょうか?私が知っている限りでは、ClassはJVMがクラスをロードするときにそのクラスのClassオブジェクトを生成している役割ですが・・
非常にわかりやすく、理解できました。ありがとうございました!
クラスローダーについて勉強になりました。
Java バンザイ!
非常に興味深く読ませていただきました。
ありがとうございます!
実は偶然通りがかったのですが、、、、、、
とても参考になります。今やってる仕事にも役に立ちそうです。
ありがとうございます。