Java リフレクションでメソッド実行

Javaでリフレクションを実行した際の備忘録
最後尾にサンプルソースを記載している


◆文字列をクラスオブジェクトに変換する
>		// 文字列をクラスオブジェクトに変換する
		String strClass = "imamu.reflect.Called";
		Class<?> c = Class.forName(strClass);

◆クラス名とメソッドの取得方法
>		// クラス名の取得
		System.out.println("Class name: " + c.getName());
		// メソッドの取得
		for (Method m : c.getMethods()) {
		      boolean isFirstParam = true;
		      System.out.print(" " + m.getName() + "(");
		      for (Class<?> p : m.getParameterTypes()) {
		        if (!isFirstParam) {
		          System.out.print(",");
		        }
		        System.out.print(p.getName());
		        isFirstParam = false;
		      }
		      System.out.println(")");
		    }

◆クラスの実行（staticメソッド、引数が配列）
※ static void main(string[] args)を実行する
>		// 実行するメソッドと引数を定義する
		String strMethod = "main";
		Method m = c.getMethod(strMethod,String[].class);
	    //引数をオブジェクト化する必要がある
		String[] strParam = {};
	    Object[] objParam = new Object[] {strParam};
	    // 実行
	    m.invoke(c,objParam);

◆クラスのインスタンス化と実行
Class.newInstance()は非推奨なので要注意
Class.getDeclaredConstructor().newInstance()とすること
>	    //インスタンス化
	    Object obj = c.getDeclaredConstructor().newInstance();
	    // メソッドの定義と実行
	    strMethod = "execTest";
		Method m2 = c.getMethod(strMethod);
	    m2.invoke(obj);

◆プライベートなstaticメソッドの実行、戻り値あり
>	    // メソッドの定義と実行
	    strMethod = "privateTest";
		Method m3 = c.getMethod(strMethod,String.class,Integer.class);
		// private 
		m3.setAccessible(true);
	    Object rtn = m3.invoke(c,"test",500);
	    System.out.println(rtn.toString());

★呼び出される側のクラス
>

	/**
	 * 呼ばれる側のクラス
	 */
	public class Called {

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		System.out.println("mainメソッドが実行されました");
	}

	public void execTest() {
		System.out.println("要インスタンス化ーexecTestが実行されました");
	}

	public static Integer privateTest(String str,Integer i) {
		System.out.println("要インスタンス化ーprivateTestが実行されました");
		return 200;
	}

	}

★呼び出す側のクラス
>	import java.lang.reflect.Method;

	/**
	 * 呼ぶ側のクラス
	 */
	public class Call {

	/**
	 *
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception{

		// 文字列をクラスオブジェクトに変換する
		String strClass = "imamu.reflect.Called";
		Class<?> c = Class.forName(strClass);

		// クラス名とメソッドの取得
		getClassNameAndMethod(c);

		/*クラスの実行（staticメソッド、引数が配列）
		※ static void main(string[] args)を実行する
		*/
		// 実行するメソッドと引数を定義する
		String strMethod = "main";
		Method m1 = c.getMethod(strMethod,String[].class);
	    //引数をオブジェクト化する必要がある
		String[] strParam = {};
	    Object[] objParam = new Object[] {strParam};
	    // 実行
	    m1.invoke(c,objParam);


	    /* クラスのインスタンス化と実行 */
	    //インスタンス化
	    Object obj = c.getDeclaredConstructor().newInstance();
	    // メソッドの定義と実行
	    strMethod = "execTest";
		Method m2 = c.getMethod(strMethod);
	    m2.invoke(obj);

	    /* プライベートなstaticメソッドの実行、戻り値あり */
	    // メソッドの定義と実行
	    strMethod = "privateTest";
		Method m3 = c.getMethod(strMethod,String.class,Integer.class);
		// private 
		m3.setAccessible(true);
	    Object rtn = m3.invoke(c,"test",500);
	    System.out.println(rtn.toString());
	    System.out.println("おしまい");

	}

	/**
	 *
	 * @param c
	 */
	private static void getClassNameAndMethod(Class<?> c ) {

		// クラス名の取得
		System.out.println("Class name: " + c.getName());

		// メソッドの取得
		for (Method m : c.getMethods()) {
		      boolean isFirstParam = true;
		      System.out.print(" " + m.getName() + "(");
		      for (Class<?> p : m.getParameterTypes()) {
		        if (!isFirstParam) {
		          System.out.print(",");
		        }
		        System.out.print(p.getName());
		        isFirstParam = false;
		      }
		      System.out.println(")");
		    }

	}


}