美文网首页
带你搞懂Java动态代理

带你搞懂Java动态代理

作者: 爺珍爱那颗心 | 来源:发表于2019-12-31 23:04 被阅读0次

    在说动态代理之前要先了解一下他的由来

    • 因为静态代理扩展能力差,可维护性差,所以JDK提供了动态代理。
      那么就让我们从代理一步步的揭开动态代理的面纱吧。

    什么是代理

    • 代理模式
      • 定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用。
      • 目的:
        ①通过引入代理对象的方式来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
        ②通过代理对象对原有的业务增强;
        可以理解为三种角色:抽象角色代理角色真实角色访问者
        其中真实角色可以理解为商场代理角色可以理解为代购抽象角色一般是一个接口可以理解为商场和``代购都对外提供的购买操作,而访问者代表找代购的顾客

    静态代理

    什么是静态代理

    抽象角色是一个接口代理角色真实角色实现这个接口,同时代理角色包含真实角色的对象并在实现抽象角色方法里调用真实角色实现的抽象角色方法来拿访问者提的要求。

    静态代理的缺点

    • 扩展能力差
    • 可维护性差
      违反了开闭原则(对扩展开放,对修改关闭)
      新来了一个访问者,就需要一个新的抽象角色和真实角色,而代理角色就需要对新的抽象角色进行实现,因而每多一个访问者,就需要对代理角色进行修改

    动态代理

    什么是动态代理

    在使用的时候动态的创建代理类真实实例
    可以理解为商家(真实对象)和淘宝要求商家的规则(抽象对象)和淘宝(代理对象),顾客相当于访问者

    动态代理的优点

    灵活性更高

    动态代理的缺点

    动态代理使用Java的反射机制,所以既然用到了反射必然运行效率上比静态代理效率低

    动态代理要使用的类

    Proxy 相当于淘宝里的商家
    InvocationHandler 相当于淘宝要求商家对客户服务提的规范

    动态代理的使用

    和静态代理一样,需要拿到真实对象的实例,通过Proxy类中的newProxyInstance来获取动态代理对象。

    public static Object newProxyInstance(
    ClassLoader loader,
    Class<?>[]interfaces,
    InvocationHandler h)
    

    三个参数的含义分别是
    ①loader:真实对象的类加载器。
    ②interfaces:真实对象所实现的接口。
    ③h:代理对象本身(代理对象实现InvocationHandler来对原有业务进行增强)

    通过动态代理对象方法进行增强

      /*通过动态代理对象方法进行增强*/
        @Override
        public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
            return null;
        }
    

    三个参数的含义分别是
    ①proxy:代理类本身。
    ②method:所要调用的对象的真实方法。
    ③objects:方法本身所用到的参数。

    参考代码如下:
    /*淘宝*/
    public class TaoBao implements InvocationHandler {
    
        /*持有的真实对象(商家)*/
        private Object market;
    
        public Object getMarket() {
            return market;
        }
    
        /*通过Proxy获得动态代理对象*/
        public Object getProxyInstance(){
            return Proxy.newProxyInstance(market.getClass().getClassLoader(),
                    market.getClass().getInterfaces(),
                    this);
        }
    
        /*通过动态代理对象方法进行增强*/
        @Override
        public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
            Object result = method.invoke(market, objects);
            return result;
        }
    }
    

    调用

    TaoBao taoBao = new TaoBao();
    Market market = (Market)taoBao.getProxyInstance();
    market.sale("xxx");
    

    由此可见我们并没有显示的创建Market(代理类),而是在运行的时候产生,从而调用代理类的方法,这就是动态代理。

    到这里动态代理的全部用法和概念就记录完成了,这个系列会持续进行更新,如果你觉得对你有帮助,不想错过更新,可以点赞关注。

    最后送一句话给自己也与各位共勉

    行百里者半九十,不要轻易自满,永远记得坚持超越自己,加油!!!

    相关文章

      网友评论

          本文标题:带你搞懂Java动态代理

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