Java动态代理与静态代理的区别示例
Java中的代理模式是一种设计模式,它允许一个类在不修改其代码的情况下增加额外的功能。Java提供了两种实现代理模式的方式:静态代理和动态代理。
静态代理静态代理在编译时就已经确定代理类和目标类的关系,代理类和目标类实现相同的接口。
示例代码:
```java//目标接口public interface Subject {
void request();
}
//目标类public class RealSubject implements Subject {
@Override public void request() {
System.out.println(“RealSubject: Handling request.”);
}
}
//代理类public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override public void request() {
System.out.println(“Proxy: Logging the time before request.”);
realSubject.request();
System.out.println(“Proxy: Logging the time after request.”);
}
}
//客户端代码public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Proxy proxy = new Proxy(realSubject);
proxy.request();
}
}``###动态代理动态代理在运行时动态创建代理类,不需要在编译时就确定代理类和目标类的关系。动态代理使用
java.lang.reflect.Proxy类和
java.lang.reflect.InvocationHandler`接口实现。
示例代码:
```javaimport java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//目标接口public interface Subject {
void request();
}
//目标类public class RealSubject implements Subject {
@Override public void request() {
System.out.println(“RealSubject: Handling request.”);
}
}
//动态代理类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: Logging the time before request.”);
Object result = method.invoke(target, args);
System.out.println(“DynamicProxy: Logging the time after request.”);
return result;
}
}
//客户端代码public class Client {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicProxyHandler(realSubject);
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
new Class[]{Subject.class},
handler);
proxy.request();
}
}
```###区别1. 编译时 vs运行时:静态代理在编译时就已经生成了代理类,而动态代理在运行时动态生成代理类。
- 代码侵入性:静态代理需要为每个目标类创建一个代理类,代码侵入性较强;动态代理不需要为每个目标类创建代理类,代码侵入性较弱。
- 灵活性:动态代理更加灵活,可以在运行时动态地为不同的目标对象创建代理。
- 性能:静态代理由于在编译时生成,性能上可能优于动态代理,动态代理由于需要在运行时生成代理类,可能会有一定的性能开销。
根据实际需求选择合适的代理方式。
还没有评论,来说两句吧...