元のクラスを書き換えずにメソッドの前後に処理を書き足すことができる.
例えばもともと次のようなソースがあったとする.
interface Test {
int test(String data);
int test2();
}
class Target implements Test {
public int test(String data) {
System.out.println(data);
return 0;
}
public int test2() {
System.out.println("test2呼び出し");
return 0;
}
}
これのtest(String data)メソッドの前後にある処理を追加したい場合は次のようなプロキシクラスを作ってやる.
class MyProxy implements InvocationHandler {
private final Object target;
public MyProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if (!method.getName().equals("test")) {// test()メソッド以外を弾く
return method.invoke(target, args);
}
System.out.println("呼び出し前");
Object ret = method.invoke(target, args);
System.out.println("呼び出し後");
return ret;
}
}
これを実行したのが下のmain文である.
public class ProxyTest {
public static void main(String[] args) {
Test test;
System.out.println("通常呼び出し");
test = new Target();
System.out.println("戻り値:" + test.test("test()"));
test.test2();
System.out.println("------------------------");
System.out.println("プロキシクラス使用");
test = (Test) Proxy.newProxyInstance(ProxyTest.class.getClassLoader(),
new Class<?>[] { Test.class }, new MyProxy(new Target()));
System.out.println("戻り値:" + test.test("test()"));
test.test2();
}
}
結果は以下のとおり
通常呼び出し
test()
戻り値:0
test2呼び出し
------------------------
プロキシクラス使用
呼び出し前
test()
呼び出し後
戻り値:0
test2呼び出し