在说动态代理
之前要先了解一下他的由来
- 因为
静态代理
扩展能力差,可维护性差,所以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(代理类),而是在运行的时候产生,从而调用代理类的方法,这就是动态代理。
到这里动态代理的全部用法和概念就记录完成了,这个系列会持续进行更新,如果你觉得对你有帮助,不想错过更新,可以点赞关注。
最后送一句话给自己也与各位共勉
网友评论