実行時型識別 (RTTI) は、Java の実行時にクラス関連の情報を維持する Java の非常に便利なメカニズムです。
ポリモーフィズムは RTTI に基づいて実装されます。 RTTI の機能は主に Class クラスによって実装されます。
クラスクラス
クラスクラスは「クラス・オブ・クラス」(クラス・オブ・クラス)です。クラスがオブジェクトの抽象化およびコレクションである場合、Class クラスはクラスの抽象化およびコレクションです。
各 Class オブジェクトは別のクラスを表します。たとえば、次のプログラムでは、Class クラスのオブジェクト c1 は Human クラスを表し、c2 は Woman クラスを表します。
次のようにコードをコピーします。
パブリッククラステスト
{
public static void main(String[] args)
{
人間 aperson = new Human();
クラス c1 = aperson.getClass();
System.out.println(c1.getName());
人間anotherperson = new Woman();
クラス c2 = anotherperson.getClass();
System.out.println(c2.getName());
}
}
クラス人間
{
/**
*アクセサ
*/
public int getHeight()
{
this.height を返します。
}
/**
* ミューテーター
*/
public void 成長高さ(int h)
{
この高さ = この高さ + h;
}
プライベート int 高さ;
}
クラスの女性は人間を拡張します
{
/**
* 新しい方法
*/
public Human giveBirth()
{
System.out.println("出産");
return (new Human());
}
}
オブジェクトの getClass() メソッドを呼び出すと、対応する Class オブジェクトへの参照を取得します。
c2 では、Women オブジェクトの参照を Human オブジェクトの参照にアップコンバートしても、オブジェクトが指す Class オブジェクトは依然として Woman です。
Java のすべてのオブジェクトには、対応する Class オブジェクトがあるため、Class オブジェクトを通じて、オブジェクトが「実際に」属しているクラスをいつでも知ることができます。参照に対してどのような型変換を実行しても、オブジェクト自体に対応する Class オブジェクトは同じです。参照を通じてメソッドを呼び出すと、Java は常に正しい Class クラスで定義されたメソッドを見つけて、その Class クラスでコードを実行できます。 Class オブジェクトが存在するため、型のアップキャストによって Java が失われることはありません。これがポリモーフィズムの原理です。
getClass: 私は誰ですか?
getClass() メソッド以外にも、Class クラスのオブジェクトを呼び出す方法があります。
次のようにコードをコピーします。
パブリッククラステスト
{
public static void main(String[] args)
{
クラス c3 = Class.forName("人間");
System.out.println(c1.getName());
クラス c4 = 女性.クラス
System.out.println(c2.getName());
}
}
上に示した 2 つの方法があります。
1. forName() メソッドは、クラスの名前である文字列をパラメータとして受け取ります。これにより、対応する Class オブジェクトが返されます。
2. Woman.class メソッドは、クラスのクラス メンバーを直接呼び出します。これにより、対応する Class オブジェクトが返されます。
クラスメソッド
Class オブジェクトは、クラスの名前、クラスが配置されているパッケージなど、対応するクラスの情報を記録します。次のような対応するメソッドを呼び出すことができます。
次のようにコードをコピーします。
getName() はクラスの名前を返します
getPackage() はクラスが配置されているパッケージを返します
Class オブジェクトの newInstance() メソッドを使用して、次のような対応するクラスのオブジェクトを作成できます。
次のようにコードをコピーします。
人間 newperson = c1.newInstance();
newInstance() は、パラメーターなしでデフォルトのビルド メソッドを呼び出します。
クラス定義のメンバーを取得できます。
次のようにコードをコピーします。
getFields() はすべてのパブリック データ メンバーを返します
getMethods() はすべてのパブリック メソッドを返します
さらに、反射解析クラスを使用することもできます。ここではこれ以上の詳細はありません。
Class クラスのその他のメソッドについては、公式ドキュメントを確認してください。
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Class.html
クラス クラスのロード
Java が Human クラス オブジェクトなどの特定のクラスのオブジェクトを作成するとき、Java はメモリ内に対応する Class オブジェクトがあるかどうかを確認します。
メモリ内に対応する Class オブジェクトがない場合、Java は .class ファイル内で Human クラスの定義を検索し、Human クラスの Class オブジェクトをロードします。
Class オブジェクトが正常にロードされると、他の Human オブジェクトの作成および関連操作は Class オブジェクトを参照します。