「java リフレクション メソッドの追加」で検索して、このブログにたどり着いた人がいるみたいだけど、既存のクラスのオブジェクトに動的にメソッドを追加したいのだろうか?それなら無理だと思うが、自分で作ったクラスなら可能かな?とりあえずやってみよう、めんどくさいので引数無し、戻り値無しのメソッドにする。
まずメソッドが追加されるクラスExtensionMethod.java
import java.util.Map; import java.util.HashMap; import java.lang.reflect.Method; public class ExtensionMethod{ Map<String, Object> objectMap; Map<String, Method> methodMap; public ExtensionMethod(){ objectMap = new HashMap<String, Object>(); methodMap = new HashMap<String, Method>(); } public void addMethod(Object obj, String name) throws Exception{ Method method = obj.getClass().getMethod(name); methodMap.put(name, method); objectMap.put(name, obj); } public void callMethod(String name) throws Exception{ methodMap.get(name).invoke(objectMap.get(name)); } }
public class Hoge{ public void hoge(){ System.out.println("hoge"); } public void hogehoge(){ System.out.println("hogehoge"); } }
public class Main{ public static void main(String[] args) throws Exception{ Hoge hoge = new Hoge(); ExtensionMethod extension = new ExtensionMethod(); //メソッドを追加する extension.addMethod(hoge, "hoge"); extension.addMethod(hoge, "hogehoge"); //追加したメソッドを呼び出す extension.callMethod("hoge"); extension.callMethod("hogehoge"); } }
こんな感じでいいのだろうか?追加したいメソッドを持つクラスのオブジェクトが必要だったり、追加したメソッドから追加されたオブジェクトへのフィールドへのアクセスができないという問題点がある。まぁ、仕方のないことだろう。そして、こんなことをして何の役に立つかは知らない。新しいフレームワークを作りたい場合に役に立ったりするのだろうか?