您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
在Java中,代理(Proxy)是一种设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。Java提供了两种类型的代理:静态代理和动态代理。
例如,定义一个接口Subject
:
public interface Subject {
void request();
}
实现被代理类RealSubject
:
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
实现代理类ProxySubject
:
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
preRequest();
realSubject.request();
postRequest();
}
private void preRequest() {
System.out.println("ProxySubject: Preparing for request.");
}
private void postRequest() {
System.out.println("ProxySubject: Finishing request.");
}
}
使用静态代理:
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现动态代理。例如,定义一个接口Subject
(与静态代理相同):
public interface Subject {
void request();
}
实现被代理类RealSubject
(与静态代理相同):
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
实现InvocationHandler
接口:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
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 for request.");
}
private void postRequest() {
System.out.println("DynamicProxyHandler: Finishing request.");
}
}
使用动态代理:
import java.lang.reflect.Proxy;
public class Main {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxyHandler handler = new DynamicProxyHandler(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
handler
);
proxySubject.request();
}
}
这两种代理方法各有优缺点。静态代理简单易懂,但需要为每个被代理类编写代理类。动态代理则可以在运行时动态生成代理类,减少了代码量,但实现起来相对复杂。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。