mixiに日記かけとか言われたので書きます。
mixi_ss_20081105.jpg
私は生きてます。なんとか。
さて、本題。
研修中にJavaを学んだ同期の方は以下のコードを見たことがあるはず。
//JDBCのドライバ登録
Class.forName("なんたらドライバー");
Class.forName で DB アクセスできるようになる理由 - すぱいだー日記。
Java の研修で DB(だいたいMDBかな) にアクセスするプログラムを作ることになったとき、講師はほぼ 100% 「JDBC Driver を使用するためには Class.forName を使用します」と言うはず。ただ、呪文のごとく。
で、Class.forName の API を見てみる。forName(String name, boolean initialize, ClassLoader loader)
指定されたクラスローダを使って、指定された文字列名を持つクラスまたはインタフェースに関連付けられた Class オブジェクトを返します
そして疑問が生まれる。「クラスをロードするだけでなんでDBにアクセスできるようになるの?」と。
コレ、オレもすげぇ思っていた。
登録というよりかは、プロジェクト配下にちゃんとドライバ置いたよなーという確認のつもりなんだろうなと思っていた。
リンク先に実装が載っているけど、なるほど、ベンダーによるDriverの各々の実装クラスがstatic initializerを持っていて、その中でDriverManager.registerDriver を呼んでいるのか。しらんかった。
あの嘘臭いと思っていたコメントはマジだったんだな。
それにしてもどうしてドライバの登録なのにClass.forNameなんて、名前からじゃ全く想像もつかんようなメソッドをよばにゃならんのだ。もう少しなんとかならんのかー。と調べていたらJava 6.0から明示的なClass.forNameの呼び出しは不要になったらしい。
DriverManager (Java Platform SE 6)
アプリケーションでは、Class.forName() を使用して JDBC ドライバを明示的にロードする必要がなくなりました。現在 Class.forName() を使用して JDBC ドライバをロードする既存のプログラムは、変更なしで動作し続けます。これで謎儀式が一つ減る。実に良いことだ。