javaの動的プロキシ実装方法
Javaでは、java.lang.reflect.Proxyクラスを使用することで動的プロキシを実現できます。
まず、被代理クラスと代理クラスの両方で実装する必要のあるメソッドを表すインターフェースを定義する必要があります。
public interface Subject {
void doSomething();
}
その後、そのインターフェイスを実装する代理クラスを作成する。
public class RealSubject implements Subject {
public void doSomething() {
System.out.println("RealSubject do something");
}
}
次に、InvocationHandler インタフェースを実装し、その invoke メソッドをオーバーライドしたプロキシクラスを作成します。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
public ProxyHandler(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在调用被代理类的方法之前,可以添加一些前置处理
System.out.println("Before calling the method");
// 调用被代理类的方法
Object result = method.invoke(target, args);
// 在调用被代理类的方法之后,可以添加一些后置处理
System.out.println("After calling the method");
return result;
}
}
最後に、Proxy.newProxyInstanceメソッドを使ってプロキシオブジェクトを作成します。
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxyHandler proxyHandler = new ProxyHandler(realSubject);
// 创建代理对象
Subject proxySubject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
proxyHandler);
// 调用代理对象的方法
proxySubject.doSomething();
}
}
上述コードを実行すると次のような結果が出力されます。
Before calling the method
RealSubject do something
After calling the method
ダイナミック・プロキシでは、プロキシされているクラスのメソッドを呼び出す前後に追加のロジック処理を加えることができることがわかる。