美文网首页
动态代理

动态代理

作者: 闫回 | 来源:发表于2021-02-23 09:44 被阅读0次
代理模式和静态代理

代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用,通俗的来讲代理模式就是我们生活中常见的中介。
目的:
(1)通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性
(2)通过代理对象对原有的业务增强
抽象角色:指代理角色和真实角色对外提供的公共方法,一般为一个接口
真实角色:需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用,也就是真正的业务逻辑在此。
代理角色:需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作,将统一的流程控制都放到代理角色中处理。

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类,一般来说,被代理对象和代理对象是一对一的关系,当然一个
代理对象对应多个被代理对象也是可以的。
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。
接口

public interface AgentInterface {
void buy();
}

被代理类:

public class Buyer implements AgentInterface{
@Override
public void buy() {
System.out.println("buy sth");
}
}

代理类:

public class BuyProxy implements AgentInterface {

AgentInterface agentInterface = new Buyer();

@Override
public void buy() {

    System.out.println("Before invoke buy" );
    agentInterface.buy();
    System.out.println("After invoke buy");
}

}

被代理类被传递给了代理类BuyProxy,代理类在执行具体方法时通过所持用的被代理类完成调用。

public static void main(String[] args) {

    BuyProxy buyProxy = new BuyProxy();

    buyProxy.buy();
}

输出

Before invoke buy
buy sth
After invoke buy
一般来说,被代理对象和代理对象是一对一的关系,当然一个代理对象对应多个代理对象也是可以的
静态代理,一对一则会出现时静态代理对象量多、代码量大,从而导致代码复杂,可维护性差的问题,一对多则代理对象会出现扩展能力差的问题

动态代理

是指在使用时再创建代理类和实例
优点
只需要1个动态代理类就可以解决创建多个静态代理的问题,避免重复、多余代码
更强的灵活性
缺点
效率低,相比静态代理中,直接调用目标对象方法,动态代理则需要先通过Java反射机制,从而间接调用目标对象方法
应用场景局限,因为Java的单继承特性(每个代理类都继承了Proxy类),即只能针对接口 创建 代理类,不能针对类创建代理类
在java的动态代理机制中,有两个重要的类或接口,一个是InvocationHandler接口、另一个则是Proxy类,这个类和接口是实现我们动态代理所必须用到的。
接口、被代理类不变,我们构建一个handler类来实现InvocationHandler接口。

public class ProxyHandler implements InvocationHandler {

private Object object;

public ProxyHandler(Object object) {
    this.object = object;
}

@Override
public Object invoke(Object o, Method method, Object[] objects) throws Throwable {

    System.out.println("Before invoke " + method.getName());
    method.invoke(o, objects);
    System.out.println("After invoke " + method.getName());
    return null;
}

}

执行动态代理:

public static void main(String[] args) {

    AgentInterface buyer = new Buyer();

    InvocationHandler proxyHandler = new ProxyHandler(buyer);

    AgentInterface proxyBuy = (AgentInterface) Proxy.newProxyInstance(buyer.getClass().getClassLoader(), buyer.getClass().getInterfaces(), proxyHandler);

    proxyBuy.buy();

}

输出
Before invoke buy
buy sth
After invoke buy
通过Proxy类的静态方法newProxyInstance返回一个接口的代理实例。针对不同的代理类,传入相应的代理程序控制器InvocationHandler。

参考
https://www.jianshu.com/p/9bcac608c714
https://juejin.cn/post/6844903591501627405

相关文章

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • 编程常用的设计模式

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

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 设计模式之代理模式

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

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

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

  • 动态代理

    动态代理分为两类:1、基于接口的动态代理; (JDK动态代理 )2、基于类的动态代理;(cglib动态代理)3、J...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • Java动态代理

    通过以下几种方式介绍动态代理 动态代理涉及到的类 动态代理用法 Proxy类解析 动态代理类解析 动态代理涉及到的...

  • Spring之代理模式

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

  • Java 代理

    静态代理 动态代理 动态代理, 日志切片使用反射获得方法 动态代理, 自定义注解(对注解的方法,使用动态代理添加切...

网友评论

      本文标题:动态代理

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