LoginSignup
1
2

More than 3 years have passed since last update.

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

Posted at

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

}

}

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2