java.lang.Classの理解

これらのクラスオブジェクトを、Javaの記法を借りて、Object.class, String.class, Person.classと書きましょう。お尻に'.class'が付いてますが、クラスそのものではなくてオブジェクトですからね!
:
Object.class, String.class, Person.classは、実行時ではなくてコンパイル時に作り込んでおく必要があります(レイフィケーションはコンパイラの仕事です)。

http://d.hatena.ne.jp/m-hiyama/20080109/1199863428

Person.classというファイルはコンパイラが作るけどPersonクラスのjava.lang.Classオブジェクトはコンパイラは作らないと思う。ClassオブジェクトはJava仮想マシンが起動時にクラスファイルPerson.classを読み込んだときに作られるものという理解のほうが正しいはずだから。初心者がクラスファイルそのものと間違ってしまいそうな記法をわざわざ選んでる時点でなにかマズいような感じがする。


リンク元の記事を見てわかった気分になっている人は、おそらくだけど、元々ちゃんとわかっていた人か、誤解してわかった気分になってしまっただけなんじゃないかと思う。


java.lang.Classは、そういう名前だからややこしく感じるのであって、理解のためには実はjava.lang.ClassInfoとかそういう名前だったということにして考えたほうがいいような気がする。Personクラスに関する情報が入っているオブジェクトが、Person.getClassInfo()で取得できるClassInfoオブジェクトなのである。

Person p = new Person();
ClassInfo ci1 = p.getClassInfo();  //ci1はPersonクラスに関する情報
ClassInfo ci2 = ci1.getClassInfo(); //ci2はClassInfoクラスに関する情報

こんな感じ。


Java2SE1.5以降はClassになっているのでリンク先の文章も上記もずいぶん古い仕様ベースの話なのでちょっとだけ注意が必要かも。