Java动态代理与静态代理的区别示例

原创 系统管理员 2024-11-11 20:21 73阅读 0赞

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运行时:静态代理在编译时就已经生成了代理类,而动态代理在运行时动态生成代理类。

  1. 代码侵入性:静态代理需要为每个目标类创建一个代理类,代码侵入性较强;动态代理不需要为每个目标类创建代理类,代码侵入性较弱。
  2. 灵活性:动态代理更加灵活,可以在运行时动态地为不同的目标对象创建代理。
  3. 性能:静态代理由于在编译时生成,性能上可能优于动态代理,动态代理由于需要在运行时生成代理类,可能会有一定的性能开销。

根据实际需求选择合适的代理方式。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读