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

静态代理和动态代理

作者: 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方法来处理。

    相关文章

      网友评论

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

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