Java代理模式详解
概念
代理模式是一种设计模式,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中,代理模式主要分为静态代理和动态代理。
静态代理
静态代理是在编译时就已经确定好代理类要代理谁。在静态代理中,我们创建一个代理类来实现与目标对象相同的接口,并在代理类中维护一个目标对象的引用。当客户端调用代理类的方法时,实际上是通过代理类间接地调用目标对象的方法。
示例
假设我们有一个接口Subject
和一个实现类RealSubject
:
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
接下来,我们创建一个代理类ProxySubject
,它实现了Subject
接口并持有一个RealSubject
的实例:
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject() {
this.realSubject = new RealSubject();
}
@Override
public void request() {
preRequest();
realSubject.request();
postRequest();
}
private void preRequest() {
System.out.println("ProxySubject: Preparing request.");
}
private void postRequest() {
System.out.println("ProxySubject: Request completed.");
}
}
在ProxySubject
中,我们在调用realSubject.request()
之前和之后分别执行了一些额外的操作。这就是静态代理的一个典型用法:在目标方法执行前后插入额外的逻辑。
动态代理
动态代理与静态代理的主要区别在于,动态代理是在运行时动态地生成代理类。在Java中,我们可以通过java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现动态代理。
示例
首先,我们定义一个InvocationHandler
的实现:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicProxyHandler implements InvocationHandler {
private Object target;
public DynamicProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
preRequest();
Object result = method.invoke(target, args);
postRequest();
return result;
}
private void preRequest() {
System.out.println("DynamicProxyHandler: Preparing request.");
}
private void postRequest() {
System.out.println("DynamicProxyHandler: Request completed.");
}
public static Object newInstance(Object target) {
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new DynamicProxyHandler(target)
);
}
}
然后,我们可以这样使用动态代理:
Subject realSubject = new RealSubject();
Subject proxySubject = (Subject) DynamicProxyHandler.newInstance(realSubject);
proxySubject.request();
这段代码首先创建了一个RealSubject
实例,然后通过DynamicProxyHandler.newInstance()
方法创建了一个代理对象。当我们调用proxySubject.request()
时,实际上会调用DynamicProxyHandler
中的invoke()
方法,从而实现在目标方法执行前后插入额外的逻辑。
总结
代理模式在Java中主要有两种实现方式:静态代理和动态代理。静态代理在编译时就已经确定好代理类要代理谁,而动态代理则可以在运行时动态地生成代理类。这两种方式都可以实现在目标方法执行前后插入额外的逻辑,但动态代理更加灵活和强大。
标签:Java,target,Object,request,代理,详解,RealSubject,public From: https://blog.csdn.net/2401_83447580/article/details/140757148