Javaで動的にメソッドを呼び出す
動的にメソッドを呼び出す場合
PHPとかでは変数にメソッド名を設定すれば簡単に使用できるけどJavaの場合はリフレクションの機能を駆使する必要がある感じのよう
今回はクラスは全部同じものとして扱う。実際はパッケージは変わる可能性があるかも…
呼び出されるメソッドのクラス
Sample02.java
package sample_method01; import sample_method01.data.Item; public class Sample02 { public void test1() { System.out.println("test1"); } public void test2(String str) { System.out.println("test2" + " " + str); } public void test3(Integer val) { System.out.println("test3" + " " + val); } public void test4(Item obj) { System.out.println("test4" + " " + obj.getName() + " " + obj.getAge()); } }
引数にクラスを指定する用
Item.java
package sample_method01.data; public class Item { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
呼び出し先
Sample01.java
package sample_method01; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import sample_method01.data.Item; public class Sample01 { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException { Sample02 obj = new Sample02(); Method method; // 引数なし method = obj.getClass().getMethod("test1"); method.invoke(obj); // 引数に1つの文字列 method = obj.getClass().getMethod("test2", new Class[]{String.class}); method.invoke(obj, "aaaa"); // 引数に1つの数値 method = obj.getClass().getMethod("test3", new Class[]{Integer.class}); method.invoke(obj, 100); // 引数に1つのクラス Item item = new Item(); item.setName("hoge"); item.setAge(30); method = obj.getClass().getMethod("test4", new Class[]{Item.class}); method.invoke(obj, item); } }
んで実行
test1 test2 aaaa test3 100 test4 hoge 30
※戻り値の取得は基本的にはObject型なのでCastする必要があるはず…
今回はここまで