m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

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する必要があるはず…

今回はここまで