getClass() メソッド、Class オブジェクト、および Reflection の概要 - 1

「こんにちは、アミーゴ!」

「さあ、メインイベントの時間です。Class クラスについて学び、Reflection について触れます。おそらく
すでにお気づきかと思いますが、Java ではすべてがオブジェクトです。そして、オブジェクトには何が必要ですか? 各オブジェクトには何が定義されていますか?それは一体何ですか?」

「授業だ!」

「そうです! よくできました。各オブジェクトにはクラスがあります。しかし、オブジェクトに戻りましょう... エンティティを完全に含むオブジェクトもあれば、エンティティの管理を支援するだけのオブジェクトもあります。」

「後者のタイプには、 FileOutputStreamThread が含まれます。 Threadオブジェクトを作成するとき、新しいスレッドは作成されません。スレッドは、 start() メソッドが呼び出された後に Java 仮想マシンによって作成されます。このオブジェクトは、プロセスの管理に役立つだけです。」

「 FileOutputStreamも同様です。ファイルはディスクに保存され、OS がストレージとアクセスを管理します。ただし、ここでも Java 仮想マシンの助けを借りて、File オブジェクトを通じてファイルと対話できます。」

「はい、それはもう分かりました。」

「つまり、クラスと対話するための Class という特別なクラスがあります。」

「それを推測するのは難しくありませんでした。」

「はい。Java 仮想マシンは新しいクラスをメモリにロードするたびに、Class オブジェクトを作成します。これを使用して、ロードされたクラスに関する特定の情報を取得できます。」

「各クラスとオブジェクトは、«クラス オブジェクト» に関連付けられます。」

説明
Class clazz = Integer.class;
Integer クラスの Class オブジェクトを取得します。
Class clazz = int.class;
int クラスの Class オブジェクトを取得します。
Class clazz = "123".getClass();
String オブジェクトの Class オブジェクトを取得します。
Class clazz = new Object().getClass();
Object オブジェクトの Class オブジェクトを取得します。

「うわー!面白い!」

「クラスという単語は Java のキーワードであり、変数名として使用できないことを覚えていますか?」

「ああ、そうだ、わかった、わかった。忘れていただけだ」

「Class オブジェクトをどこかですでに使用しましたか?」

「はい、equals メソッドの独自の実装を作成するときにこれを使用しました。」

「はい、getClass() メソッドを使用して、オブジェクトが同じクラスを持つかどうかをテストできます。」

「で、この物体で何ができるの?」

「そうですね、いろいろありますね。」

Javaコード 説明
Class s = int.class;
String name = s.getName();
クラス名を取得します。
Class s = Class.forName("java.lang.String");
名前でクラスを取得します。
Object o1 = String.valueOf(1);
Object o2 = 123 + "T";
o1.getClass() == o2.getClass();
オブジェクトのクラスを比較します。

「面白いけど、思ったほどクールではなかった。」

「クールにしたいですか? Reflectionもあります。Reflection 超クールです。」

リフレクションって何?」

"リフレクションは、クラス自体に関する情報を取得するクラスの機能です。 Java には、 クラスの Classクラスに似た、FieldおよびMethodという特別なクラスがあります。 Classオブジェクトでクラスに関する情報を取得できるのと同じように、 Field オブジェクトはフィールドに関する情報を提供します。そして、Method オブジェクトはメソッドに関する情報を提供します。そして、それらを使って何ができるか見てみましょう:"

Javaコード 説明
Class[] interfaces = List.class.getInterfaces();
List クラスのインターフェイスの Class オブジェクトのリストを取得します。
Class parent = String.class.getSuperclass();
Stringクラスの親クラスのClassオブジェクトを取得します。
Method[] methods = List.class.getMethods();
List クラスのメソッドのリストを取得します。
String s = String.class.newInstance();
新しい文字列を作成します
String s = String.class.newInstance();
Method m = String.class.getMethod("length");
int length = (int) m.invoke(s)
String クラスの長さメソッドを取得し、 String でそれを呼び出します。

「うわー!すごいですね!」