【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メソッドしか拾ってこれないようなので、注意が必要です。