JDBCドライバのロード
備忘録として
以下のようなコードはよくみるけど実際はどうなってるの?
Class.forName("org.sqlite.JDBC"); conn = DriverManager.getConnection("jdbc:sqlite:sample.db");
- Class.forNameは引数の文字列を動的にロードする
org.sqlite.JDBCの実装をみてるみるとこんな感じ
public class JDBC implements Driver { public static final String PREFIX = "jdbc:sqlite:"; static { try { DriverManager.registerDriver(new JDBC()); } catch (SQLException e) { e.printStackTrace(); } }
staticの部分はstaticイニシャライザ。クラスがロードされたときに評価される。
つまりこういうこと
- Class.forNameで実行時に引数で指定したクラス(この場合はDriverを実装したクラス)がロードされる
- staticイニシャライザにより、DriverManagerにインスタンスが登録される
という流れ