みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

JDBCドライバーのロードに関して

参考書やwebページのソースコードにJDBCドライバーのロードのときに、Class.forName("...")と書いているものと、Class.forName("...").newInstance()と書いているものがあります。[...部分は省略]この二つのコードは、どこが違うのでしょうか。また、Sunmicroのホームページで、forNameメソッドは、"指定された文字列名を持つクラスまたはインタフェースに関連付けられた、Class オブジェクトを返します。"と、newInstanceメソッドは、"この Class オブジェクトが表すクラスの新しいインスタンスを生成します。"と書かれていますが、どうしてこれで、JDBCドライバーがロードされるのですか?また、初歩的な質問ですが、JDBCドライバーがロードされるというのは、どうゆうことですか?教えてください。

投稿日時 - 2005-09-03 23:57:10

QNo.1625145

ab5

困ってます

質問者が選んだベストアンサー

簡単に言うと、Class#forName()を呼び出すと、forNameで指定したDriverクラス(正しく言うとjava.sql.Driverインターフェースを実装したクラス)は自分自身をDriverManagerに登録(registerDriverを呼ぶ)します。
そして、DriverManagerがそのDriverクラスが登録されることで、DriverManager#getConnection()にて指定されたurlに基づいて適切なDriverクラスが選択されるようになります。
この辺りはJavaDocに詳しく書いてあります。

>Class.forName("...").newInstance()と書いているものがあります
これはNGです。
DriverはDBベンダー等の実装に任されているのでデフォルトコンストラクタが実装されているとは限りませんのでエラーになる可能性がありますし、そもそもインスタンスを作り出す必要がありません。

参考URL:http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jdbc/getstart/drivermanager.html#997322

投稿日時 - 2005-09-04 18:03:21

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

Javaプログラムの構成やロードについてどの程度理解していますか。
JavaプログラムはA.classなど各クラスのクラス名に拡張子classを付けた名前のファイル群として構成され、プログラム中でクラスが使用される最初の機会に自動的に各ファイルがロードされ静的初期化子が実行されます。これがクラスのロードです。
JavaのクラスはプログラムからClassクラスのオブジェクトとして参照できるようになっており、Class.forNameでClassオブジェクトを参照することでクラスがロードできます。
JDBCドライバは通常Javaで記述されていてクラスの体裁を取るので、このドライバクラスのロードがドライバのロードとなります。

Class.forName("...")とClass.forName("...").newInstance()の違いについては前者は...クラスをロードし、後者は...クラスをロードしてそのインスタンスを作成するということになります。
単純に考えるとドライバをクラスで扱うかインスタンスで扱うかの違いですが、もしかすると後者はドライバローダ・クラスを取得してドライバをnewInstanceで得ているかもしれません。

投稿日時 - 2005-09-04 09:52:59

あなたにオススメの質問