Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

書籍 パーフェクトJava | リフレクション | 型情報の取得

パンくず

書籍 パーフェクトJava
リフレクション
型情報の取得

概要

Javaのリフレクションの型情報の取得について。

内容

インターフェースか判断

isInterface

配列か判断

isArray

基本か判断

isPrimitive

enumか判断

isEnum

※その他詳細はサンプルコード参照

サンプルコード

package perfect.reflection;

import java.util.List;

public class SampleReflection2 {
  enum NUM {ONE,TWO,THREE};

  @SuppressWarnings("unused")
  public static void main(String[] args) throws ClassNotFoundException {
    // ClassクラスのstaticメソッドのclassForNameによる取得
    Class<SampleReflectionInner> hogeClass = getClass("perfect.reflection.SampleReflection2$SampleReflectionInner");

    // インターフェースか判断
    System.out.print("String.class.isInterface():");
    System.out.println(String.class.isInterface());
    System.out.print("List.class.isInterface():");
    System.out.println(List.class.isInterface());

    // 配列か判断
    System.out.print("String.class.isArray():");
    System.out.println(String.class.isArray());
    System.out.print("String[].class.isArray():");
    System.out.println(String[].class.isArray());

    // 基本型か判断
    System.out.print("String.class.isPrimitive():");
    System.out.println(String.class.isPrimitive());
    System.out.print("int.class.isPrimitive():");
    System.out.println(int.class.isPrimitive());

    // Enumか判断
    System.out.print("String.class.isEnum():");
    System.out.println(String.class.isEnum());
    System.out.print("NUM.class.isEnum():");
    System.out.println(NUM.class.isEnum());

    // publicメソッド名(基底クラス含む)を取得
    System.out.print(String.class.getMethods()[0]);
    System.out.println(String.class.getMethods()[0]);

    // 全メソッド名(基底クラス含まない)を取得
    System.out.print(String.class.getDeclaredMethods()[0]);
    System.out.println(String.class.getDeclaredMethods()[0]);

    // publicフィールド名(基底クラス含む)を取得
    System.out.print(String.class.getFields()[0]);
    System.out.println(String.class.getFields()[0]);

    // 全フィールド名(基底クラス含まない)を取得
    System.out.print(String.class.getDeclaredFields()[0]);
    System.out.println(String.class.getDeclaredFields()[0]);

    // 全てのpublicコンストラクタ情報を取得
    System.out.print(String.class.getConstructors()[0]);
    System.out.println(String.class.getConstructors()[0]);

    // 基底クラスの取得
    System.out.print("String.class.getSuperclass():");
    System.out.println(String.class.getSuperclass());

    // Enumの値取得
    System.out.print("NUM.class.getEnumConstants()[0]:");
    System.out.println(NUM.class.getEnumConstants()[0]);

    // 『Java 言語仕様』の定義に従って、基本となるクラスの正規名を返します。
    System.out.print("String.class.getCanonicalName():");
    System.out.println(String.class.getCanonicalName());

    // ソースコード内で指定されたとおり、基本となるクラスの単純名を返します。
    System.out.print("String.class.getSimpleName():");
    System.out.println(String.class.getSimpleName());
  }

  @SuppressWarnings("unchecked")
  public static <T> Class<T> getClass(String className) throws ClassNotFoundException {
    // Class型の変数名は伝統的にclazzを利用する。
    Class<T> clazz = (Class<T>) Class.forName(className);
    return clazz;
  }

  public static class SampleReflectionInner {
    private String name;

    public String getName() {
      return name;
    }

    public void setName(String name) {
      this.name = name;
    }

    public void hoge(String hoge) {
      System.out.println("hoge:" + hoge);
    }
  }
}

出力

String.class.isInterface():false
List.class.isInterface():true
String.class.isArray():false
String[].class.isArray():true
String.class.isPrimitive():false
int.class.isPrimitive():true
String.class.isEnum():false
NUM.class.isEnum():true
public boolean java.lang.String.equals(java.lang.Object)public boolean java.lang.String.equals(java.lang.Object)
public boolean java.lang.String.equals(java.lang.Object)public boolean java.lang.String.equals(java.lang.Object)
public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDERpublic static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
private final char[] java.lang.String.valueprivate final char[] java.lang.String.value
public java.lang.String()public java.lang.String()
String.class.getSuperclass():class java.lang.Object
NUM.class.getEnumConstants()[0]:ONE
String.class.getCanonicalName():java.lang.String
String.class.getSimpleName():String