すたらブログ

文系Webプログラマの備忘録

Java: JDBCドライバをClass.forNameメソッドでロードすることの意味が分からなかったので調べた

疑問1

なぜ"com.mysql.jdbc.Driver"をforNameメソッドでロードするのか?
import宣言ではダメなのか?

調査結果

  • おそらく、JDBCドライバは古いJavaの標準クラスライブラリ(?)には含まれていないため、importすらできないと思われる。
  • forNameメソッドJDBCドライバのインスタンスを作るのではなく、拡張子が『.class』の一般的なクラスファイルと同じく、JVMがファイルを読み込んだ状態にするものらしい。

参照: Class.forName()とnewの違い(JDBCでClass.forNameを使う理由)|あなたに送る独り言byはむばね


疑問2

ならば、なぜ『ファイルを読み込んだ状態(ロード)』だけでドライバを使えるようになるのか?
new演算子インスタンス化しなくていいのか?

調査結果

  • ロード時にstaticイニシャライザ(static初期化子)が実行され、その中でドライバがインスタンス化されている。

参照: Class.forName で DB アクセスできるようになる理由 - すぱいだー日記。


なお、JDBC4.0からはforNameメソッドでロードせずに使えるようになったそうです。

参照: JDBCメモ(Hishidama's JDBC Memo)