クラスが複雑なデータ型であるという事実についてはすでに説明しました。ここで、クラスの裏側、つまり Java マシンによってクラスがどのように処理されるかについて少し話しましょう。Java では、クラスであってもすべてがオブジェクトであることを思い出してください。クラスはオブジェクトです。それはあなたを驚かせますか?それでは続けましょう。

クラスをメモリにロードする

実際、クラスがメモリにロードされると、次の 3 つの特別な「オブジェクト」が作成されます。

クラスをメモリにロードする

図の簡単な説明:

黄色の四角形:

コード ファイルは、「.class」拡張子が付いたファイルとしてディスクに保存されます。これには、クラス、そのフィールド、メソッドに関する情報と、バイトコードにコンパイルされたメソッドのソース コードが含まれています。

オレンジ色の長方形:

Java マシンはクラスをメモリにロードするときに、バイトコードをコンピュータのプロセッサとオペレーティング システムに固有のマシン コードにコンパイルします。Java マシンのみがこのマシン コードにアクセスできます。Java プログラマとして、私たちはそれにアクセスすることができません。

緑色の四角形:

Java マシンは、クラスのすべての静的変数とメソッドを含むオブジェクトを作成します。この「オブジェクト」にはクラス名を使用してアクセスします。

たとえば、 と記述すると、クラス内にある静的変数を参照することになります。このオブジェクトは緑色の長方形です。そして、そこに静的変数が保存されます。java.lang.Math.PIPIjava.lang.Mathjava.lang.MathPI

青い四角形:

Java マシンがクラスのコードをメモリにロードすると、java.lang.Classロードされたクラスに関する情報 (名前、メソッド名、フィールド名と型など) が格納される特別なオブジェクトが作成されます。

「クラス」という名前は少しわかりにくいかもしれません。このクラスはロードされたクラスに関する情報を保存するだけなので、ClassInfo と呼ぶ方が合理的です。

次のようなコマンドを使用して、任意の型の Class オブジェクトを取得できます。

Class name = ClassName.class;

例:

コード ノート
Class a = String.class;
クラスClassに関する情報を含むオブジェクトを取得しますString
Class b = Object.class;
クラスClassに関する情報を含むオブジェクトを取得しますObject
Class c = Integer.class;
クラスClassに関する情報を含むオブジェクトを取得しますInteger
Class d = int.class;
Classに関する情報を含むオブジェクトを取得するint
Class e = void.class;
Classに関する情報を含むオブジェクトを取得するvoid

getClass()各オブジェクトにはクラスから継承するメソッドがあるため、任意のオブジェクトからクラス記述オブジェクトへの参照を取得することもできますObject

例:

コード ノート
Class a = "Hello".getClass();
と同じオブジェクトString.class
Class b = new Integer().getClass();
と同じオブジェクトInteger.class
Class c = Boolean.TRUE.getClass();
と同じオブジェクトBoolean.class