Classリファレンスを取得する3つの方法は?Class.forName()、getClass、および.classの使用


コードをつけて!!!
package com.spring.partise;

class A{
    static{
        System.out.println("I am A");
    }
}
public class helllo {
    public static void main(String[] args) throws Exception {
        System.out.println("------------ Class ---------------");
        A a = new A();
        Object a1= a.getClass();
        System.out.println(a1.hashCode());
        System.out.println("---------------------------");
        Object name = Class.forName("com.spring.partise.A");
        System.out.println(name.hashCode());
        System.out.println(a1==name);
    }
}

出力:
------------ Class ---------------
I am A
705927765
---------------------------
705927765
true

まとめ:
実行時にタイプ情報を使用するには、まず適切なClassオブジェクトへの参照を取得する必要があります.Class.forName()は、Classリファレンスを取得するためにこのタイプのオブジェクトを持つ必要がないため、この機能を実現する便利な方法です.ただし、このタイプのオブジェクト(A a=new A())をすでに持っている場合は、getClass()メソッドを呼び出すことで、Objectの一部に属するClass参照を取得できます.
もちろん3つ目のクラスを得るクラスオブジェクトの方式はクラス名を通過することである.classここではテストしません.クラス字面定数でClassオブジェクトを生成する参照は、コンパイル時にチェックされ、forNameメソッドの呼び出しが根絶されるため、より効率的で、インタフェース、配列、基本データ型などに適用できます.この方法でClassオブジェクトの参照を作成する際に自動的にそのClassオブジェクトを初期化することはありません.クラスを使用するための準備作業には、実際には3つのステップがあります.
  • は、クラスローダによって実行されるロードである.このステップでは、バイトコードを検索し、これらのバイトコードからClassオブジェクトを作成します.
  • リンクは、リンクフェーズでクラス内のバイトコードを検証し、静的ドメインにストレージスペースを割り当て、必要に応じてクラスが作成した他のクラスへのすべての参照を解析します.
  • が初期化され、クラスにスーパークラスがある場合、そのクラスが初期化され、静的初期化器および静的初期化ブロックが実行される.