山崎屋の技術メモ

IT業界で働く中でテクノロジーを愛するSIerのシステムエンジニア👨‍💻 | AndroidとWebアプリの二刀流🧙‍♂️ | コードの裏にあるストーリーを綴るブログ執筆者✍️ | 日々進化するデジタル世界で学び続ける探究者🚀 | #TechLover #CodeArtisan、気になること、メモしておきたいことを書いていきます。

Class.forNameの意味

かつて JDBC 経由でデータベースにアクセスする場合、こういうおまじないがありました。(Java SE 6 以降はドライバの指定方法が変更されているので不要です。「[JDBC はいつから Class.forName() が必要なくなったのか」)

Class.forName("oracle.jdbc.driver.OracleDriver");

いったい何の意味があるのでしょうか?

Class.forNameはJavaDocによると「forName("X") の呼び出しによって、X というクラスが初期化されます。」です。

Class.forNameを利用することにより、なぜDBが利用できるようになるのかを理解するためには、javaのクラス初期化子( Static イニシャライザ )の動きを知っておく必要があります。


このようなクラスがあるとします。

public class Sample {
    static{
        System.out.println("ここがクラス初期化子です。");
    }
    public static void main(String[] args) {
        System.out.println("main内部です。");
    }
}

実行結果。

ここがクラス初期化子です。
main内部です。

このようにクラス初期化子はメインメソッドより先に実行されています。
クラス初期化子が実行されるのはクラスがJVM上にロードされたタイミングです。(クラスがロードされるタイミングはJVMにより幅があります。)

JDBCドライバでは、このクラス初期化子を利用し、ドライバマネージャにドライバクラスのインスタンスをセットしています。これは、どのベンダのJDBCドライバでも同じです。

サンプルとして、H2DatabaseのJDBCドライバのクラス初期化子です。

   static
   {
     load();
   }

SQLServerはこれです。

  static
  {
    try
    {
      DriverManager.registerDriver(new SQLServerDriver());
    }
    catch (SQLException localSQLException) {
      localSQLException.printStackTrace();
    }
  }

Class.forName("xxx")を実行することにより、このクラス初期化子が明示的に実行され、DBへのアクセスが可能になるというわけです。