带你搞懂Java动态代理

2019-12-31  本文已影响0人  爺珍爱那颗心

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

什么是代理

静态代理

什么是静态代理

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

静态代理的缺点

动态代理

什么是动态代理

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

动态代理的优点

灵活性更高

动态代理的缺点

动态代理使用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(代理类),而是在运行的时候产生,从而调用代理类的方法,这就是动态代理。

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

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

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

上一篇 下一篇

猜你喜欢

热点阅读