Java リフレクションにおける `Class.forName()` と `Class.forName().newInstance()` の違いは何ですか?

Patricia Arquette
リリース: 2024-11-08 11:56:01
オリジナル
849 人が閲覧しました

What is the difference between `Class.forName()` and `Class.forName().newInstance()` in Java reflection?

Class.forName() と Class.forName().newInstance()

Java リフレクションを使用する場合、多くの場合 2 つのメソッドが登場します。プレイ: Class.forName() および Class.forName().newInstance()。それらの違いを理解するために、例を使用してみましょう。

デモ クラス:

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();
    }
}
ログイン後にコピー

Class.forName()

そのドキュメントによると、Class.forName(String) は、クラスに関連付けられた Class オブジェクトを取得します。または指定された名前のインターフェイス。この例では、これは clazz 変数に保存される te​​st.Demo.class に変換されます。

Class.forName().newInstance()

clazz.newInstance() Class オブジェクトによって表されるクラスをインスタンス化します。引数を指定しない場合、これは new Demo() と同等であり、新しい Demo インスタンスを返します。

出力:

この Demo クラスを実行すると、次のように出力されます:

Hi!
ログイン後にコピー

動的インスタンス化

重要な点は、newInstance を使用すると、名前が事前にわかっていなくても、実行時にクラスを動的にインスタンス化できるようになります。これにより、コードの柔軟性が高まります。

実用的なアプリケーション

JDBC ドライバーは、この機能を利用して、実行時にターゲット データベースに基づいて適切なドライバーをロードします。同様に、EJB コンテナとサーブレット コンテナは、事前知識がなくても動的読み込みを使用してコンポーネントを初期化します。

JDBC ドライバの初期化

JDBC ドライバは、多くの場合、静的初期化ブロックを使用して、自身を DriverManager に登録します。クラスの初期化中。これは、Class.forName(String) が JDBC ドライバーのインスタンスを「作成」できるように見えますが、それはドライバーの実装の副産物にすぎないことを意味します。

JDBC 4.0 の機能強化

JDBC 4.0 と Java 7 では自動ロードが導入され、明示的にClass.forName() はほとんどの場合不要です。開発者は、詳細について「Java SE 6 での JDBC 4.0 の機能強化」リソースを参照してください。

以上がJava リフレクションにおける `Class.forName()` と `Class.forName().newInstance()` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート