読者です 読者をやめる 読者になる 読者になる

山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

Class.forNameの意味

JDBC経由でデータベースにアクセスする場合、こういうおまじないがありますね。

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

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

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

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


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

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へのアクセスが可能になるというわけです。