初心者のための
「Javaによるオブジェクト指向入門」

A-1 ".class" の謎


 本文で説明したように、 あるオブジェクトに対応するクラスの情報を取り出すためには getClass()メソッドを用います。 このメソッドは Objectクラスの中で finalなメソッドとして定義されています。 したがって Javaの全てのオブジェクトは必ず Classの情報を取り出せることが 保証されています。
 ではオブジェクトが存在しないクラスの場合はどうすればいいのでしょうか? 抽象クラスやインターフェイスでも、 それに対応する Classのオブジェクトは必要になるかもしれません。 Classクラスには、クラス名を指定してクラスのオブジェクトを生成する staticなメソッド forName()が定義されています。

  Class cls = Class.forName( "java.awt.Graphics" );

またこの形式とは別に、 Javaには Classのオブジェクトを得るもう一つの記述方法が存在します。

  Class cls = Graphics.class;

この方が手軽で見やすいでしょう。 ちょうど staticなメンバーへのアクセスと同じ形式の表記です。 ただし JDKのAPIにはこのようなメンバーが存在することは記述されていません。 そもそも "class" は Java言語の最も基本的な予約語の1つです。 メンバー名に使用することは本来許されないはずです (Class class; のように変数名を宣言できないのと同じ理由)。 実際 staticなメンバーの場合と異なり、 次のような記述はエラーとなります。

  Color color1 = Color.white;
  Color color2 = color1.red;  // 正しい (Color.red と同じ意味になる)
  Class cls = color1.class;   // エラー (Color.class とは解釈されない)

つまり ".class" は Javaの文法の一部であり、 クラスの型から直接Classのオブジェクトを取り出す専用の記述方法だということです。

 ".class" の形式で Class のオブジェクトを取得する特殊なケースとして、 原始型に対応する Classのオブジェクト(!?)を得る場合も考えられます。 意外に思えるでしょうが次に示すのは正しい記述です。


  Class cls = int.class;

得られたクラスのオブジェクトは「int という原始型」という情報を持ちます。 もちろんこのオブジェクトに対しては、 内部のメンバーやパッケージの情報を調べることは無意味です。 しかしデータの名前を調べたりする際に共通の取り扱いが可能となります。 理屈の上からは Classというクラス名の実態と合わないのですが、 プログラム上はこの方が便利です。 今回紹介したクラスのメンバーを調べるサンプル(MemberInfo.java)の中でも、 Classのオブジェクトを使って、クラス、配列、原始型のすべてのデータを 共通に取り扱っています。


「今回の目次」  「全体の目次」