java 静态代理 动态代理
时间: 2023-11-20 12:56:54 浏览: 82
Java 静态代理
以下是Java中静态代理和动态代理的介绍和示例:
静态代理:
静态代理是在编译期间就已经确定代理类的代码,需要为每一个被代理的类编写一个代理类。静态代理的优点是简单易懂,缺点是需要手动编写代理类,当被代理的类增加方法时,代理类也需要相应地修改。
示例代码:
假设有一个接口`Subject`和它的实现类`RealSubject`,我们需要为`RealSubject`类创建一个代理类`ProxySubject`,并在代理类中调用`RealSubject`类的方法。
```java
// 接口
public interface Subject {
void request();
}
// 实现类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
// 代理类
public class ProxySubject implements Subject {
private RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("ProxySubject request");
realSubject.request();
}
}
// 测试类
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
ProxySubject proxySubject = new ProxySubject(realSubject);
proxySubject.request();
}
}
```
动态代理:
动态代理是在运行时动态生成代理类的代码,不需要事先知道代理类的代码。Java中的动态代理主要有两种形式,一种是基于接口的动态代理,另一种是基于类的动态代理。其中,基于接口的动态代理使用较为广泛。
示例代码:
假设有一个接口`Subject`和它的实现类`RealSubject`,我们需要为`RealSubject`类创建一个动态代理类,并在代理类中调用`RealSubject`类的方法。
```java
// 接口
public interface Subject {
void request();
}
// 实现类
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject request");
}
}
// 动态代理类
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("DynamicProxy request");
Object result = method.invoke(target, args);
return result;
}
}
// 测试类
public class Test {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
DynamicProxy dynamicProxy = new DynamicProxy(realSubject);
Subject proxySubject = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
dynamicProxy);
proxySubject.request();
}
}
```
阅读全文