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(")");
}
}
}