在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
方法,从而在原始方法调用之前和之后执行一些额外的操作。