Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

書籍 パーフェクトJava | リフレクション | オブジェクトの生成と操作

パンくず

書籍 パーフェクトJava
リフレクション
オブジェクトの生成と操作

概要

Javaのリフレクションのオブジェクトの生成と操作について。

オブジェクトの生成

以下の2つの方法でインスタンスの生成が可能です。
ClassクラスのnewInstanceメソッド
ConstructorクラスのnewInstanceメソッド

前者は引数無しのコンストラクタに対して。
後者は引数有りのコンストラクタに対して利用するのが一般的です。

オブジェクトの操作

メソッドの呼び出しはMethodクラスのInvokeメソッドを利用します。

サンプルコード

package perfect.reflection;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

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

  @SuppressWarnings("unused")
  public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException,
      IllegalArgumentException, SecurityException, InvocationTargetException, NoSuchMethodException {
    // ClassクラスのstaticメソッドのclassForNameによる取得
    Class<SampleReflectionInner> clazz = getClass("perfect.reflection.SampleReflection3$SampleReflectionInner");

    // ClassクラスのnewInstanceによるインスタンス生成
    SampleReflectionInner hoge1 = clazz.newInstance();
    hoge1.hoge("hoge");
    hoge1.hoge();

    // ConstructorクラスのnewInstanceによるインスタンス生成
    SampleReflectionInner hoge2 = clazz.getConstructor(String.class).newInstance("constructor");
    hoge2.hoge("hoge");
    hoge2.hoge();

    // メソッドの呼び出し
    Method hogeMethod = clazz.getMethod("hoge", String.class);
    hogeMethod.invoke(hoge2, "hogeParam");
  }

  @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 SampleReflectionInner() {

    }

    public SampleReflectionInner(String hoge) {
      this.name = hoge;
    }

    public String getName() {
      return name;
    }

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

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

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

出力

hoge:hoge
hoge:null
hoge:hoge
hoge:constructor
hoge:hogeParam