倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

いまさら!? Class クラス (1) : Class が表す型の種類

最近、Class クラスに定義されているメソッドがイマイチ把握できてないなぁと実感することがしばしばあったので、ちょっとここいらで復習を敢行。 すべてのメソッドを網羅できるかどうかは不明ですが、なるべく多くのメソッドを(簡単にでも)扱えればと思ってます。

今回は Class が表す型の種類を判定する isXxxx() メソッド。

シリーズ目次

  1. Class が表す型の種類
  2. Class オブジェクトの取得方法
  3. 文字列に関するメソッド
  4. クラス宣言
  5. クラス階層とインスタンス
  6. メンバへのアクセス
  7. 特定のクラスに固有のメソッド
  8. リソース、セキュリティ

メソッド一覧

今回扱う isXxxx() メソッドの一覧。 返り値はすべて boolean です。 メソッドの分類は独断と偏見

メソッド名 true を返す型
プリミティブ型 isPrimitive() プリミティブ型
クラス isMemberClass()
isLocalClass()
isAnonymousClass()
メンバクラス(内部クラス)
ローカルクラス
無名クラス
インターフェース
アノテーション
isInterface()
isAnnotation()
インターフェース
アノテーション
特殊なクラス isArray()
isEnum()
isSynthetic()
配列
列挙型
Synthetic クラス

通常よく作成する public クラス(トップレベルクラスと言った方がいいかな?)はこれら全てのメソッドで false を返します。

以降では、各型の(ごくごく簡単な)定義の仕方と、インスタンスの取得方法*1を見ていきます*2。 つまり、Class クラスに定義されているメソッドにはもはや関係がありませんがあしからず。

プリミティブ型

Java のプリミティブ型 (primitive type) には次の8つがあります:

  • boolean
  • byte
  • short
  • int
  • long
  • float
  • double
  • char

独自のプリミティブ型は定義できません。 また、インスタンスはそれぞれに決められたリテラルを指定します。

クラス

ここでは、通常よく使用するトップレベルクラス(他のクラスやメソッドの内部に定義されていないクラス)以外のクラスを見ていきます。 こういったクラスには

  • メンバクラス(内部クラス)
  • ローカルクラス
  • 無名クラス

があります。 それぞれの定義の仕方は以下の通り:

public class SomeClass {

    /** メンバクラス(内部クラス) */
    private class MemberClass{
        ...
    }

    /** static 版メンバクラス(内部クラス) */
    public static class StaticMemberClass{
        ...
    }

    public void someMethod(){
        // ローカルクラス
        class LocalClass{
            ...
        }

        LocalClass lc = new LocalClass(...);

        // 無名クラス
        ActionListener listener = new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                // 何らかの処理
            }
        };
    }
}

使用方法は通常のトップレベルクラスと大体同じです。 スコープ(使用できる範囲)は異なりますが。

インターフェース、アノテーション

ここではインターフェース (interface) とアノテーション (annotation) を見ていきます。 これらはどちらも interface キーワードを使用しているのでまとめてますが、使用法には特に共通点があるわけではありません(それとも、某かの深謀遠慮があるのかな?)。

インターフェース
インターフェースを定義するには interface キーワードを使用します:

public interface MyInterface{
    // 仕様の定義
}

アノテーション
アノテーションを定義するには @interface を使用します:

public @interface MyAnnotation{
    // 仕様の定義
}

特殊なクラス

ここでは、配列 (array) と 列挙型 (enum) を見ていきます。 これらの型はインスタンスの生成方法や定義の仕方(Enum の場合)に特殊な記法、文法が用意されていて、言語レベルで仕様が決められていますが、インスタンスの扱い方・扱われ方は通常の Java オブジェクトと大した違いはありません。 特に Enum オブジェクトは java.lang.Enum クラス(のサブクラス)のオブジェクトそのものです。

上の分類では、Synthetic クラスもこの分類に含めていますが、そもそも Synthetic クラスというものがよく分わからず、JavaDoc には「言語仕様を見ろ」と書いてますが、何処の箇所を言っているのか不明。 どうも、「ソースコードには含まれておらず、コンパイラが生成したクラス」らしいですが*3。 ともかく、ここでは(以降のこの記事でも)扱いません。

配列
配列には「独自の配列」といったものはないので、ここではインスタンスの取得方法のみを見ていきます。 配列(のインスタンス)を作成する方法には以下のようなものがあります:

String[] array1 = new String[3];
String[] array2 = {"a", "b"};
String[] array3 = new String[]{"ab", "cd"};

1番目は、更に配列の各要素を初期化する必要があります。

列挙型
列挙型を作成するには enum キーワードを使用します:

public enum MyEnum{
    JAVA, GROOVY, SCALA, VISAGE
}

インスタンスを取得するには、通常のクラスで static フィールドを参照するのと同じ方法で行います:

MyEnum lang = MyEnum.JAVA;

Java言語仕様 第3版 (The Java Series)

Java言語仕様 第3版 (The Java Series)

  • 作者: ジェームズゴスリン,ガイスティール,ビルジョイ,ギッラードブラーハ,James Gosling,Guy Steele,Bill Joy,Gilad Bracha,村上雅章
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2006/12
  • メディア: 単行本
  • 購入: 1人 クリック: 118回
  • この商品を含むブログ (44件) を見る

*1:リテラルの指定やコンストラクタによるインスタンス生成のみを扱い、メソッドや演算子の返り値で取得する方法を除きます。

*2:Class オブジェクトの取得方法ではありません。 これは後日に。

*3:一部では Proxy クラスなどがそうだと書いているサイトもありますが、java.lang.reflect.Proxy クラスを使って生成したクラスで試しても、このメソッドは true を返しませんでした。