Tbpgr Blog

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

書籍 パーフェクトJava | リフレクション | Classクラスのインスタンス取得方法について

パンくず

書籍 パーフェクトJava
リフレクション

概要

Javaのリフレクションについて。
リフレクションとは実行中に型情報を取得し、
型そのものを操作対象とする仕組み。

Classクラス

Classクラスは、型情報を保持するクラス。
フィールド一覧やメソッド一覧を利用可能。

Classオブジェクトの取得方法

・クラスリテラルの利用
・ObjectのgetClassメソッド
・ClassクラスのstaticメソッドのclassForName

サンプルコード

package perfect.reflection;

public class SampleReflection1 {
  public static void main(String[] args) throws ClassNotFoundException {
    // クラスリテラルによるClassオブジェクトの取得
    Class<SampleReflectionInner> hogeClass1 = SampleReflectionInner.class;
    System.out.println(hogeClass1);
    System.out.println(hogeClass1.hashCode());

    // ObjectのgetClassメソッドによる取得
    SampleReflectionInner hoge = new SampleReflectionInner();
    Class<? extends SampleReflectionInner> hogeClass2 = hoge.getClass();
    System.out.println(hogeClass2);
    System.out.println(hogeClass2.hashCode());

    // ClassクラスのstaticメソッドのclassForNameによる取得
    Class<SampleReflectionInner> hogeClass3 = getClass("perfect.reflection.SampleReflection1$SampleReflectionInner");
    System.out.println(hogeClass3);
    System.out.println(hogeClass3.hashCode());
  }

  @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);
    }
  }
}

出力

class perfect.reflection.SampleReflection1$SampleReflectionInner
17192413
class perfect.reflection.SampleReflection1$SampleReflectionInner
17192413
class perfect.reflection.SampleReflection1$SampleReflectionInner
17192413