您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
在Java中,代理(Proxy)是一种设计模式,它允许你提供一个代理对象来控制对另一个对象的访问。代理模式可以用于多种场景,比如延迟加载、访问控制、日志记录等。在Java中,代理可以分为静态代理和动态代理两种。
静态代理是指在编译时就已经确定了代理类和被代理类的关系。下面是一个简单的静态代理示例:
public interface Subject {
void request();
}
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
public class StaticProxy implements Subject {
private RealSubject realSubject;
public StaticProxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
// 在调用实际对象的方法前后可以添加额外的逻辑
System.out.println("StaticProxy: Before handling request.");
realSubject.request();
System.out.println("StaticProxy: After handling request.");
}
}
public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
StaticProxy proxy = new StaticProxy(realSubject);
proxy.request();
}
}
动态代理是指在运行时动态生成代理类。Java提供了java.lang.reflect.Proxy
类和java.lang.reflect.InvocationHandler
接口来实现动态代理。
public interface Subject {
void request();
}
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 {
// 在调用实际对象的方法前后可以添加额外的逻辑
System.out.println("DynamicProxy: Before handling request.");
Object result = method.invoke(target, args);
System.out.println("DynamicProxy: After handling request.");
return result;
}
}
import java.lang.reflect.Proxy;
public class Client {
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();
}
}
在这个例子中,我们使用Proxy.newProxyInstance()
方法动态地创建了一个代理对象,该对象实现了Subject
接口,并将所有方法调用转发给DynamicProxyHandler
实例。这样,我们可以在不修改RealSubject
类的情况下,为其添加额外的功能。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。