- ベストアンサー
JDBCドライバーのロードに関して
参考書やwebページのソースコードにJDBCドライバーのロードのときに、Class.forName("...")と書いているものと、Class.forName("...").newInstance()と書いているものがあります。[...部分は省略]この二つのコードは、どこが違うのでしょうか。また、Sunmicroのホームページで、forNameメソッドは、"指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Class オブジェクトを返します。"と、newInstanceメソッドは、"この Class オブジェクトが表すクラスの新しいインスタンスを生成します。"と書かれていますが、どうしてこれで、JDBCドライバーがロードされるのですか?また、初歩的な質問ですが、JDBCドライバーがロードされるというのは、どうゆうことですか?教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
簡単に言うと、Class#forName()を呼び出すと、forNameで指定したDriverクラス(正しく言うとjava.sql.Driverインターフェースを実装したクラス)は自分自身をDriverManagerに登録(registerDriverを呼ぶ)します。 そして、DriverManagerがそのDriverクラスが登録されることで、DriverManager#getConnection()にて指定されたurlに基づいて適切なDriverクラスが選択されるようになります。 この辺りはJavaDocに詳しく書いてあります。 >Class.forName("...").newInstance()と書いているものがあります これはNGです。 DriverはDBベンダー等の実装に任されているのでデフォルトコンストラクタが実装されているとは限りませんのでエラーになる可能性がありますし、そもそもインスタンスを作り出す必要がありません。
その他の回答 (1)
- rinkun
- ベストアンサー率44% (706/1571)
Javaプログラムの構成やロードについてどの程度理解していますか。 JavaプログラムはA.classなど各クラスのクラス名に拡張子classを付けた名前のファイル群として構成され、プログラム中でクラスが使用される最初の機会に自動的に各ファイルがロードされ静的初期化子が実行されます。これがクラスのロードです。 JavaのクラスはプログラムからClassクラスのオブジェクトとして参照できるようになっており、Class.forNameでClassオブジェクトを参照することでクラスがロードできます。 JDBCドライバは通常Javaで記述されていてクラスの体裁を取るので、このドライバクラスのロードがドライバのロードとなります。 Class.forName("...")とClass.forName("...").newInstance()の違いについては前者は...クラスをロードし、後者は...クラスをロードしてそのインスタンスを作成するということになります。 単純に考えるとドライバをクラスで扱うかインスタンスで扱うかの違いですが、もしかすると後者はドライバローダ・クラスを取得してドライバをnewInstanceで得ているかもしれません。