2017-03-16 6 views
0

私は定義を知っています。私たちがクラスのタイプを知らないときはClass.forName("")を使用しますが、それはここでの難点です。インスタンスをロードするためにnewキーワードに対してClass.forName()を使用する利点は何ですか?

私が言う場合:

Class.forName("SomeClass"); 

だから私は "工ass" のタイプを知っています。コンパイル時に "SomeClass"が存在するかどうかは、すべてのコンパイラがClass.forName("SomeClass")の場合はチェックしません。しかし、実行時にチェックします。しかし、それは本当に利点ですか?誰もがこれを私にリアルタイムのシナリオで説明できますか?

+1

コンパイル時に特定のクラスを知りたくない場合はどうすればよいですか? – chrylis

答えて

0

Class.forName()は、コンパイル時に存在する必要のないクラスをロードします。Class.forName()が実行されたときに存在する必要があります(多くの場合、クラスの読み込み時間、実行時には命令が指定された場所によって異なります) 。たとえば、データベース固有のデータベースドライバの場合、アプリケーションクラスによって実装クラスが提供され、アプリケーションの開発時にそのインスタンスを気にする必要はありません。

import com.someclass.Foo; 

Foo foo; // class would be loaded 

しかし、これはまだnewキーワードを使用して作成されますクラスのインスタンスではありません。コンパイル時にクラスをロードし

代替は、このようなものになるだろう。インスタンスが異なる - インスタンスが必要な場合は、クラスを実際にロードする方法とは無関係に、まだnewで作成します。

1

Class.forName()は、特定の名前のクラスを提供します。インスタンス化しません。あなたはそのためClass.newInstance()を使用することができます(それに問題があります - 詳細はhereを参照してください)あなたは(たとえば)に設定ファイルがクラスの名前を特定するフレームワークを、これを使用すると思い

注意しますロードしたい。すなわちそのクラスはランタイム(たとえば、Spring XML設定)で変更することができます。このような状況では、選択したクラスがすべて共通のインターフェイスを実装する可能性が高くなります。それ以外の場合は、後続のコードと相互作用することは困難です。

関連する問題