美文网首页
静态代理和动态代理

静态代理和动态代理

作者: zzz_0427 | 来源:发表于2024-05-18 11:45 被阅读0次

静态代理和动态代理是两种在软件开发中常用的代理模式,它们用于在不直接访问实际对象的情况下,通过一个代理对象来间接地访问实际对象。

静态代理
静态代理是一种在编译时就已经确定代理类和目标对象关系的代理方式,通过jvm类加载器把目标类和代理类加载到jvm中。在静态代理中,代理类和目标对象的关系是固定的,并且代理类需要与目标对象实现相同的接口。

特点:

编译时确定:代理类和目标对象的关系在编译时就已经确定。
一对一:一个代理类只能代理一个目标对象。
代码冗余:如果目标对象很多,需要为每个目标对象创建一个代理类,导致代码冗余。
硬编码:代理类和目标对象的关系是硬编码的,不够灵活。
实现方式:

动态代理(代理类中jvm运行时创建,jvm运行结束后,消失了)
创建一个接口,目标对象和代理对象都实现这个接口。
代理对象持有目标对象的引用,并在执行目标对象的方法前后添加额外的操作。
动态代理是一种在运行时动态创建代理对象的方式,它不需要在编译时就确定代理类。动态代理通常使用反射机制来实现。

特点:

运行时确定:代理对象和目标对象的关系在运行时确定。
一对多:一个动态代理可以代理多个目标对象。
灵活性:不需要为每个目标对象创建代理类,可以通过接口或类来动态生成代理类。
减少代码冗余:通过动态生成代理类,减少了代码的冗余。
实现方式:

使用反射机制,动态创建代理类。
代理类在运行时通过反射调用目标对象的方法,并在调用前后添加额外的操作。
举例
假设有一个Subject接口,RealSubject类实现了这个接口,Proxy类是静态代理,DynamicProxy是动态代理。

静态代理示例:

interface Subject {
void request();
}

class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject: Handling request.");
}
}

class Proxy implements Subject {
private RealSubject realSubject = new RealSubject();

public void request() {
    System.out.println("Proxy: Logging the time of request.");
    realSubject.request();
    System.out.println("Proxy: Request completed.");
}

}
动态代理示例:

import java.lang.reflect.*;

interface Subject {
void request();
}

class RealSubject implements Subject {
public void request() {
System.out.println("RealSubject: Handling request.");
}
}

class DynamicProxyHandler implements InvocationHandler {
private Object realSubject;

public DynamicProxyHandler(Object realSubject) {
    this.realSubject = realSubject;
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    System.out.println("DynamicProxyHandler: Before the request.");
    Object result = method.invoke(realSubject, args);
    System.out.println("DynamicProxyHandler: After the request.");
    return result;
}

}

// Usage
Subject subject = (Subject) Proxy.newProxyInstance(
RealSubject.class.getClassLoader(),
new Class[] { Subject.class },
new DynamicProxyHandler(new RealSubject())
);
subject.request();
在动态代理中,Proxy.newProxyInstance方法在运行时动态创建了一个实现了Subject接口的代理对象,并且代理对象的每个方法调用都会通过DynamicProxyHandler的invoke方法来处理。

相关文章

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • 静态代理、动态代理

    代理分为静态代理和动态代理 按照代理创建的时期,可以分为静态代理和动态代理: (1) 静态代理:由程序员或者...

  • JAVA动态代理的实现方式

    1. 静态代理VS动态代理 代理类可以增强被代理对象的方法。可分为静态代理和动态代理。 1.1 静态代理 静态代理...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • Java 代理的实现原理

    一、怎样使用代理 二、代理实现的原理 一、代理分为静态代理和动态代理 静态代理:代理对象获得目标对象的引用 动态代...

  • 带你初识Java的代理模式

    Spring AOP是基于动态代理设计模式实现的,相对的就有静态代理 动态代理和静态代理 静态代理 对于静态代理,...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

  • Java高级主题(五)——动态代理

    代理可以分为静态代理、动态代理,动态代理又可以分为 jvm的动态代理 和 cglib的动态代理。像spring框架...

  • java静态代理与动态代理简单分析

    原链接地址 1、动态代理(Dynamic Proxy) 代理分为静态代理和动态代理,静态代理是在编译时就将接口、实...

  • 动态代理和静态代理

    一、什么是静态代理和动态代理 静态代理:手动的创建代理类在程序运行前代理类就已经存在了。 动态代理...

网友评论

      本文标题:静态代理和动态代理

      本文链接:https://www.haomeiwen.com/subject/dqgwfjtx.html