■前置き
JavaにClassクラスが存在することを大抵のJava技術者はご存知だと思いますが、実際、Classクラスとは何なのか、いつ、どうやって生成されるかなど、知らない人がほとんどではないでしょうか?
多分、使ったことがあるのは、主に以下の2パターン
1.DB接続時にドライバクラスをforName()する。
2.インスタンスからクラス情報を取得する
1は多分、みんな、おまじないのように使ってる。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
って感じで、よくわからないけど、上記のようにドライバクラスを指定してからじゃないとDB接続できないから、おまじないとして使ってる。という人が多いと思います。
2は用途はいろいろですが、インスタンスからgetClass().getName()してクラス名を取得して、ログに出したり、なんちゃらしたりだと思います。
■Classクラス
すべてのクラスのスーパークラスである java.lang.Object クラスにgetClass()というメソッドが実装されており、サブクラスのインスタンス生成時に該当のサブクラスのClass情報をClassクラスのインスタンスとして生成し、保持します。
また、同時にObjectクラスにはclassというpublic static finalフィールド(メンバ変数)が存在し、クラスロード時に生成され、String.classという様にすることで、対象のクラスのClassクラスを取得することができる。
※更に詳細に話すと、ClassLoaderクラスとリフレクションの話をしなければなりませんが、そこを話すと長くなりますので、今回は割愛します。
■Class.forName(”DBドライバクラス”)
ちょっと余談になりますが、前置きで書いたDBドライバをforName()する理由について説明します。
このforName()メソッドは、引数に文字列で指定したクラスのClassクラスを取得するのが、本来の使い方です。ですので、DBドライバクラスをforNameすると、返り値として、DBドライバクラスのClassクラスを取得できます。しかし、DBドライバクラスをforName()する理由はClassクラスを取得するためではありません。
forName()することにより、DBドライバクラスがロードされ、staticイニシャライザが実行されます。DBドライバクラスは全て、java.sql.Driverを実装しており、各DBドライバクラスでは、staticイニシャライザでDriverManagerクラスというドライバを管理するクラスにDBドライバクラス自身を登録しに行くという処理を実施しています。
こうすることにより、後続処理で各DBドライバを利用しての、DB接続処理を実施することができるようになる。
※誤りございましたら、申し訳ありませんが、ご指摘願います。