Java の動的プロキシ

忘れてたのでメモ

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