动态代理和静态代理

  • 代理是一种软件设计模式,目的地希望能做到代码重用
  • 通过不直接访问被代理对象的方式,访问被代理对象的方法.eg:商户---->明星经纪人(代理)---->明星。通过明星经纪人访问明星

使用场景

  • 之前的代码很难修改,但是需要扩展方法
  • Spring的AOP机制

静态代理

  • 代码编译时就确定了被代理的类是哪一个,那么就可以直接使用静态代理
  • 对于静态代理,代理类要实现和被代理类相同的接口
  • 说简单点:静态代理就是代理类中引入了被代理类的对象,通过静态代理访问被代理类,增强被代理类的某些方法

动态代理

  • 代码运行期间加载被代理的类这就是动态代理,比如RPC框架和Spring AOP机制
  • 被代理的类需要实现一个接口
  • 不直接访问某些对象的情况下,通过代理机制也可以访问被代理对象的方法
  • jdk的代理机制必须要求被代理类实现某个接口,这样生成的代理类才能知道重写哪些方法
  • 委托类:InvocationHandler。通过代理类调用方法的时候最终都会调用里面的invoke()
public class DynamicProxy implements InvocationHandler {

    private Object obj;
    public DynamicProxy(Object obj){
        this.obj=obj;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("invoke method");
        return method.invoke(this.obj,args);
    }
    public static Object getInstance(Object student){
        ClassLoader classLoader=student.getClass().getClassLoader();
        Class<?>[] interfaces=student.getClass().getInterfaces();
        //此处interfaces必须是接口,如果是实体类会报错
        Object proxy = Proxy.newProxyInstance(classLoader, interfaces, new DynamicProxy(student));
        return proxy;
    }
}
  • 动态代理的步骤:
    • 实现 InvocationHandler 接口产生一个方法委托类(调用代理类中的方法时便会调用委托方法)
    • 使用 Proxy 来产生代理类

概览:https://blog.youkuaiyun.com/u011784767/article/details/78281384
内部原理(自己写一个proxy):https://www.cnblogs.com/lfdingye/p/7717063.html

静态代理和动态代理

  • 相比于动态代理,静态代理想要代理一个接口,就必须新写一个该接口的实现类。如果接口中增加一个方法,则所有的代理都得去实现这个方法
  • 动态代理很好的解决了上面的两个问题,所有的接口都可以使用同一个代理类;即使接口方法发生变化,也不会影响
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值