[解決済み] Class.forName()」と「Class.forName().newInstance()」の違いは何ですか?
質問
とはどのような違いがあるのでしょうか?
Class.forName()
と
Class.forName().newInstance()
?
私は重要な違いを理解していない(私はそれらについて何かを読んだことがある!)。あなたは私を助けることができるでしょうか?
どのように解決するのですか?
この2つのメソッドがどのように使われるかを示す例が、理解を深めるのに役立つかもしれません。そこで、次のようなクラスを考えてみましょう。
package test;
public class Demo {
public Demo() {
System.out.println("Hi!");
}
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("test.Demo");
Demo demo = (Demo) clazz.newInstance();
}
}
javadocで説明されているように、このメソッドは
Class.forName(String)
が返されます。
Class
与えられた文字列の名前を持つクラスまたはインターフェイスに関連付けられたオブジェクト。
を返す。
test.Demo.class
に影響される。
clazz
型の変数
Class
.
次に
clazz.newInstance()
で表されるクラスの新しいインスタンスを作成します。
Class
オブジェクトを作成します。このクラスは、あたかも
new
式で、引数リストが空であること。
つまり、これはここでは実際に
new Demo()
の新しいインスタンスを返します。
Demo
.
そして、これを実行すると
Demo
クラスは、このように次のような出力をします。
Hi!
従来の
new
というのは
newInstance
を使えば、実行するまでわからないクラスをインスタンス化することができ、コードがよりダイナミックになります。
典型的な例はJDBC APIで、仕事を実行するために必要な正確なドライバを実行時にロードします。EJBsコンテナやServletコンテナは、実行前に何も知らないコンポーネントをロードして作成するために、動的な実行時ロードを使用します。
さらに詳しく知りたい方は、Ted Newardの論文を見てください。 Class.forName()を理解する をパラフレーズしたものです。
EDIT (コメントとして投稿されたOPからの質問に答えて)。JDBCドライバの場合は、少し特殊です。の中で説明されているように ドライバマネージャ の章を参照してください。 JDBC API入門 :
(...) A
Driver
クラスがロードされ したがって、自動的に と共にDriverManager
は、次の2つのうちどちらかです。 の方法があります。
メソッドを呼び出すことで
Class.forName
. これは明示的にロードします。 ドライバクラスを作成します。このクラスは 外部設定に依存しないので、この方法 ドライバをロードする方法として推奨されるのは を使用するためのものです。DriverManager
フレームワークを使用します。次のコードでは クラスacme.db.Driver
:Class.forName("acme.db.Driver");
もし
acme.db.Driver
を読み込むと インスタンスが生成され、さらにDriverManager.registerDriver
その インスタンスをパラメータとする (それが のはずです)であれば、それはDriverManager
のドライバ一覧と 接続を作成するために利用可能です。
- (...)
これらのいずれの場合も、新しく読み込まれた
Driver
を呼び出して自分自身を登録する必要があります。DriverManager.registerDriver
. 前述のように、これはクラスがロードされたときに自動的に行われるはずです。
初期化中に自分自身を登録するために、JDBCドライバは通常、このような静的な初期化ブロックを使用します。
package acme.db;
public class Driver {
static {
java.sql.DriverManager.registerDriver(new Driver());
}
...
}
呼び出し
Class.forName("acme.db.Driver")
の初期化を行います。
acme.db.Driver
クラスを作成し、静的初期化ブロックを実行します。また
Class.forName("acme.db.Driver")
は確かにインスタンスを作成しますが、これは(良い)JDBCドライバがどのように実装されているかの結果に過ぎません。
余談ですが、JDBC 4.0(Java7からデフォルトのパッケージとして追加)とJDBC 4.0ドライバの新しいオートローディング機能により、これらすべてが不要になったことをお伝えしておきます。以下を参照してください。 Java SE 6におけるJDBC 4.0の強化点 .
関連
-
eclipse アクセス制限です。タイプ 'xxx' は API ではありません(必須ライブラリ '' の制限)。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
myeclipseでコンパイルするとAntエラーが発生する javaの例外が発生しました。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
スレッド "main" で例外発生 java.net.BindException: アドレスは既に使用中です。NET_Bind
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
java 例外。Javaツールの初期化
-
JSPで「リストが型解決できない!」の解決方法
-
[解決済み] JavaとMySQLデータベースの接続
-
[解決済み】静的初期化ブロック