サンプルプログラム

SomeUtil?.java

package com.snail.exam.javaexam;

public final class SomeUtil {

  /**
   * デフォルトコンストラクタの無効化.
   */
  private SomeUtil() {
    super();
  }

  /**
   * x! を求めます.
   * @param x 数値
   * @return x!
   */
  public static int factorial(final int x) {
    return recursive(x);
  }

  /**
   * 再帰的に x * recursive(x-1) を実行します.
   * @param x 数値
   * @return x!
   */
  private static int recursive(final int x) {
    if (x == 1) {
      return x;
    }
    return x * recursive(x - 1);
  }
}

SomeUtilTest?.java (リフレクション)

package com.snail.exam.javaexam;

import java.lang.reflect.Method;
import java.lang.reflect.Constructor;
import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class SomeUtilTest {

  @Test
  public void testFactorial() {
    // 普通のテスト
    assertEquals(1, SomeUtil.factorial(1));
    assertEquals(120, SomeUtil.factorial(5));
  }

  @Test
  public void testPublicMethod() throws Exception {

    Method method = SomeUtil.class.getMethod("factorial", int.class);
    assertEquals(1, method.invoke(null, 1));
    assertEquals(120, method.invoke(null, 5));
  }

  @Test
  public void testPrivateMethod() throws Exception {
    // Private な Constructor を呼び出す
    Class clazz = Class.forName("com.snail.exam.javaexam.SomeUtil");
    Constructor constructor = clazz.getDeclaredConstructor();
    constructor.setAccessible(true);

    Object obj = constructor.newInstance();

    // Private な recursive() メソッドを呼び出す
    Method method = clazz.getDeclaredMethod("recursive", int.class);
    method.setAccessible(true);

    assertEquals(1, method.invoke(obj, 1));
    assertEquals(120, method.invoke(obj, 5));
  }
}

実行結果

test.png

クラス名からオブジェクトを作成する

Public コンストラクタ

Class clazz = Class.forName("com.snail.exam.javaexam.SomeBean");
Constructor constructor = clazz.getConstructor();

Object obj = constructor.newInstance();

引数があるコンストラクタを指定する場合は、getConstructor() で、引数クラスを指定する

Class clazz = Class.forName("com.snail.exam.javaexam.SomeBean");
Constructor constructor = clazz.getConstructor(String.class, int.class);

Object obj = constructor.newInstance();

Private コンストラクタ

Class clazz = Class.forName("com.snail.exam.javaexam.SomeUtil");
Constructor constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true);

Object obj = constructor.newInstance();

getDeclaredConstructor?() は、Private コンストラクタも指定できる。
setAccessible(true); でアクセスできるようにしてから newInstance()

メソッド名からメソッドを実行する

Public メソッド

SomeBean bean = new SomeBean();
Method method = SomeBean.class.getMethod("getChild", int.class);
assertEquals("Taro", method.invoke(bean, 1));

Public static メソッド

Method method = SomeUtil.class.getMethod("factorial", int.class);
assertEquals(1, method.invoke(null, 1));
assertEquals(120, method.invoke(null, 5));

method.invoke() の第一引数に null を指定する

Private メソッド

Method method = clazz.getDeclaredMethod("recursive", int.class);
method.setAccessible(true);

assertEquals(1, method.invoke(obj, 1));
assertEquals(120, method.invoke(obj, 5));

getDeclaredConstructor?() は、Private メソッドも指定できる。
setAccessible(true); でアクセスできるようにしてから invoke()

引数が配列の場合


Java#JavaSE


添付ファイル: filetest.png 558件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Last-modified: 2013-02-04 (月) 23:22:21 (1402d)
ISBN10
ISBN13
9784061426061