前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >带你搞懂Java动态代理

带你搞懂Java动态代理

作者头像
longzeqiu
发布2020-02-10 12:00:01
3450
发布2020-02-10 12:00:01
举报
文章被收录于专栏:Android小知识Android小知识

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

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

什么是代理

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

静态代理

什么是静态代理

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

静态代理的缺点

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

动态代理

什么是动态代理

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

动态代理的优点

灵活性更高

动态代理的缺点

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

动态代理要使用的类

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

动态代理的使用

和静态代理一样,需要拿到真实对象的实例,通过Proxy类中的newProxyInstance来获取动态代理对象。
代码语言:javascript
复制
public static Object newProxyInstance(
ClassLoader loader,
Class<?>[]interfaces,
InvocationHandler h)

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

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

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

参考代码如下:
代码语言:javascript
复制
/*淘宝*/
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;
    }
}

调用

代码语言:javascript
复制
TaoBao taoBao = new TaoBao();
Market market = (Market)taoBao.getProxyInstance();
market.sale("xxx");

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

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

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

行百里者半九十,不要轻易自满,永远记得坚持超越自己,加油!!!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是代理
    • 静态代理
      • 什么是静态代理
      • 静态代理的缺点
    • 动态代理
      • 什么是动态代理
      • 动态代理的优点
      • 动态代理的缺点
      • 动态代理要使用的类
      • 动态代理的使用
    • 到这里动态代理的全部用法和概念就记录完成了,这个系列会持续进行更新,如果你觉得对你有帮助,不想错过更新,可以点赞关注。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档