【Java】Method.invokeを弄ってみた

たまにPHPフレームワーク的な何かを作る時に、メソッドの文字列呼び出しを使います。
現在、Android用のMyClassを作成しているということもあり、Javaで同様のことが出来ないか調べてみました。

本職の人からすれば、「こんなのJavaじゃねえ!」とお叱りがあるかもしれませんが、ご容赦頂ければ。

まずはPHPのコード

<?php
class MethodHandler
{
    function execMethod( $method )
    {
        $ret = method_exists( this, $method );
        if( $ret == false ){return;}
        $this->{$method}();
    }
    function printHoge(){
        print "hoge\n";
    }
    function printFoo(){
        print "foo\n";
    }
    function printBar(){
	print "bar\n";
    }
}
$method_handler = new MethodHandler();
//hoge
$method_handler->execMethod("printHoge");
//foo
$method_handler->execMethod("printFoo");
//bar
$method_handler->execMethod("printBar");

説明するまでもなく、execMethodの引数と同一のメソッドが実行されるシンプルなコードです。

Javaの場合

以下の方法で実現出来そうです。

java.lang.reflect.Method method = className.getClass().getMethod( "methodName");
method.invoke(className)
MethodHandler.java
package org.hekkun;

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

public class MethodHandler
{
    private Method call_method;
    public void execMethod(String methodName){
        try {
	    //getMethodで取得するメソッドはpublicじゃないといけないようです
	    call_method = getClass().getMethod(methodName);
	} catch (SecurityException e) {
	} catch (NoSuchMethodException e) {
	}
	try {
	    call_method.invoke(this);
	} catch (IllegalArgumentException e) {
	} catch (IllegalAccessException e) {
	} catch (InvocationTargetException e) {
	}
    }

    public void printHoge()
    {
        System.out.println("hoge");
    }
    public void printFoo()
    {
        System.out.println("foo");
    }
    public void printBar()
    {
        System.out.println("bar");
    }
}
InvokeSample.java
package org.hekkun;

public class InvokeSample
{
    public static void main(String[] args) {
        MethodHandler methodHandler = new MethodHandler();
	//hoge
	methodHandler.execMethod("printHoge");
	//foo
	methodHandler.execMethod("printFoo");
	//bar
	methodHandler.execMethod("printBar");
    }
}

つまり引数の文字列から、メソッドインスタンスを取得して、invoke()でメソッド呼び出しということですね。
簡単に実装できました。
ただ、getMethod()はpublicメソッドしか拾ってこれないようなので、注意が必要です。