在Java中,靜態代理模式通常涉及到使用java.lang.reflect.Proxy
類和java.lang.reflect.InvocationHandler
接口。雖然static
關鍵字在靜態代理模式中沒有直接應用,但我們可以利用靜態方法和靜態內部類來實現靜態代理。
靜態代理模式的主要目的是在不修改原始類代碼的情況下,為原始類添加新的功能。通過創建一個代理類,我們可以在調用原始類方法之前或之后執行一些額外的操作。
下面是一個簡單的靜態代理模式的例子:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 原始接口
interface MyInterface {
void doSomething();
}
// 原始類實現接口
class MyInterfaceImpl implements MyInterface {
@Override
public void doSomething() {
System.out.println("Doing something...");
}
}
// 代理類
class MyProxyHandler implements InvocationHandler {
private Object target;
public MyProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method call...");
Object result = method.invoke(target, args);
System.out.println("After method call...");
return result;
}
}
// 靜態代理工具類
class ProxyFactory {
public static <T> T createProxy(Class<T> interfaceClass, T target) {
MyProxyHandler handler = new MyProxyHandler(target);
return (T) Proxy.newProxyInstance(interfaceClass.getClassLoader(), new Class<?>[]{interfaceClass}, handler);
}
}
public class StaticProxyDemo {
public static void main(String[] args) {
MyInterfaceImpl realObject = new MyInterfaceImpl();
MyInterface proxy = ProxyFactory.createProxy(MyInterface.class, realObject);
proxy.doSomething();
}
}
在這個例子中,我們定義了一個MyInterface
接口和一個實現該接口的MyInterfaceImpl
類。然后,我們創建了一個MyProxyHandler
類,它實現了InvocationHandler
接口,并在調用方法之前和之后執行一些額外的操作。最后,我們創建了一個ProxyFactory
類,它提供了一個靜態方法createProxy
,用于創建代理對象。
在StaticProxyDemo
類的main
方法中,我們首先創建了一個MyInterfaceImpl
對象,然后使用ProxyFactory.createProxy
方法創建了一個代理對象。當我們調用代理對象的doSomething
方法時,實際上會調用MyProxyHandler
中的invoke
方法,從而在原始方法調用之前和之后執行一些額外的操作。