Javaで特定のオブジェクトをどのように傍受するか
代替オブジェクトをインターセプトするためにJavaでプロキシパターンを使用できます。プロキシパターンは、他のオブジェクトへのアクセスを制御するための代理オブジェクトを提供することを可能にする構造的なデザインパターンです。
動的プロキシを使用するサンプルコードを以下に示します。
最初にインタフェイスSubjectを定義します。このインタフェイスは、インターセプトが必要なメソッドを含んでいます:
public interface Subject {
void doSomething();
}
次に、実際の処理を行う RealSubject という、このインターフェースを実装した具象クラスを作成します。
public class RealSubject implements Subject {
public void doSomething() {
System.out.println("RealSubject: doing something");
}
}
次に、InvocationHandler インターフェイスを実装したプロキシクラス ProxySubject を作成し、RealSubject のメソッドに対する呼び出しをインターセプトします。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxySubject implements InvocationHandler {
private Subject realSubject;
public ProxySubject(Subject realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在调用实际对象之前可以添加一些逻辑
System.out.println("ProxySubject: before doing something");
// 调用实际对象的方法
Object result = method.invoke(realSubject, args);
// 在调用实际对象之后可以添加一些逻辑
System.out.println("ProxySubject: after doing something");
return result;
}
}
最後に、main関数内でプロキシオブジェクトを作成し、メソッドを呼び出す:
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
// 创建代理对象
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
proxySubject);
// 调用代理对象的方法
proxy.doSomething();
}
}
上記のコードを実行すると、以下の結果が出力されます。
ProxySubject: before doing something
RealSubject: doing something
ProxySubject: after doing something
実オブジェクトにメソッド呼び出しが委譲され、呼び出しの前後に追加のロジックが追加されたことがわかります。