「Java」invokeでリフレクションのMethodオブジェクトからのメソッドを実行する

環境
JDK1.8
Eclipse2019

書式
invoke(Object obj, Object… args)
このMethodオブジェクトによって表される基本となるメソッドを、指定したオブジェクトに対して指定したパラメータで呼び出します。
個別のパラメータは、プリミティブ仮パラメータと一致させるために自動的にラップ解除され、プリミティブおよび参照パラメータは両方とも
必要に応じてメソッド呼出し変換の対象になります。

使用例

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
package com.arkgame.study.java;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Cft {
public static void main(String[] args) {
Users ur = new Users();
// Usersクラスのインスタンスを取得
Class<?> ca = ur.getClass();
try {
// クラスUsersのメソッドsetUsername情報を取得
Method md1 = ca.getMethod("setUsername", String.class);
System.out.println("invokeでクラスUsersのメソッドsetUsernameを実行するサンプル");
// Methodのinvokeメソッドを利用して「setUsername」メソッドを実行する
md1.invoke(ur, "川崎 太郎");
} catch (NoSuchMethodException e) {// 特定のメソッドが見つからない
e.printStackTrace();
} catch (SecurityException e) { // セキュリティ違反
e.printStackTrace();
} catch (InvocationTargetException e) { // 呼び出されるメソッドまたはコンストラクタがスローする例外
e.printStackTrace();
} catch (IllegalAccessException e) { // 実行中のメソッドが指定されたクラスの定義にアクセスできない場合にスローされる例外
e.printStackTrace();
}
}
}
//クラスUsers
class Users {
public void setUsername(String name) {
System.out.println("ユーザー名: " + name);
}
}
package com.arkgame.study.java; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class Cft { public static void main(String[] args) { Users ur = new Users(); // Usersクラスのインスタンスを取得 Class<?> ca = ur.getClass(); try { // クラスUsersのメソッドsetUsername情報を取得 Method md1 = ca.getMethod("setUsername", String.class); System.out.println("invokeでクラスUsersのメソッドsetUsernameを実行するサンプル"); // Methodのinvokeメソッドを利用して「setUsername」メソッドを実行する md1.invoke(ur, "川崎 太郎"); } catch (NoSuchMethodException e) {// 特定のメソッドが見つからない e.printStackTrace(); } catch (SecurityException e) { // セキュリティ違反 e.printStackTrace(); } catch (InvocationTargetException e) { // 呼び出されるメソッドまたはコンストラクタがスローする例外 e.printStackTrace(); } catch (IllegalAccessException e) { // 実行中のメソッドが指定されたクラスの定義にアクセスできない場合にスローされる例外 e.printStackTrace(); } } } //クラスUsers class Users { public void setUsername(String name) { System.out.println("ユーザー名: " + name); } }
package com.arkgame.study.java;

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

public class Cft {

      public static void main(String[] args) {
            Users ur = new Users();
            // Usersクラスのインスタンスを取得
            Class<?> ca = ur.getClass();

            try {
                  // クラスUsersのメソッドsetUsername情報を取得
                  Method md1 = ca.getMethod("setUsername", String.class);
                  System.out.println("invokeでクラスUsersのメソッドsetUsernameを実行するサンプル");
                  // Methodのinvokeメソッドを利用して「setUsername」メソッドを実行する
                  md1.invoke(ur, "川崎 太郎");
            } catch (NoSuchMethodException e) {// 特定のメソッドが見つからない
                  e.printStackTrace();
            } catch (SecurityException e) { // セキュリティ違反
                  e.printStackTrace();
            } catch (InvocationTargetException e) { // 呼び出されるメソッドまたはコンストラクタがスローする例外
                  e.printStackTrace();
            } catch (IllegalAccessException e) { // 実行中のメソッドが指定されたクラスの定義にアクセスできない場合にスローされる例外
                  e.printStackTrace();
            }

      }
}

//クラスUsers
class Users {
      public void setUsername(String name) {
            System.out.println("ユーザー名: " + name);
      }

}

実行結果
invokeでクラスUsersのメソッドsetUsernameを実行するサンプル
ユーザー名: 川崎 太郎

Java

Posted by arkgame