忘れてたのでメモ
Listのプロキシ作ってメソッド呼び出し前後にログ出力の例
動的プロキシ作れるのはインターフェースに対してのみ
Main.java
import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List list = (List)Proxy.newProxyInstance( ArrayList.class.getClassLoader(), new Class[]{ List.class }, new Invocation(new ArrayList())); list.add("test1"); list.get(0); list.clear(); } }
Invocation.java
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.Arrays; public class Invocation implements InvocationHandler { private Object target; public Invocation(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("START:" + target.getClass() + "." + method.getName() + Arrays.asList(method.getParameterTypes()).toString()); Object ret = method.invoke(target, args); System.out.println("END"); return ret; } }
実行結果
List のメソッド呼び出しの前後でログ出力されてる
START:class java.util.ArrayList.add[class java.lang.Object] END START:class java.util.ArrayList.add[class java.lang.Object] END START:class java.util.ArrayList.get[int] END