在说动态代理
之前要先了解一下他的由来
静态代理
扩展能力差,可维护性差,所以JDK
提供了动态代理。
那么就让我们从代理一步步的揭开动态代理的面纱吧。抽象角色
、代理角色
、真实角色
和访问者
。
其中真实角色
可以理解为商场
,代理角色
可以理解为代购
,抽象角色
一般是一个接口可以理解为商场
和``代购都对外提供的购买操作
,而访问者
代表找代购的顾客
。抽象角色
是一个接口
,代理角色
和真实角色
都实现这个接口
,同时代理角色
包含真实角色的对象
并在实现
的抽象角色方法
里调用真实角色实现的抽象角色方法
来拿访问者
提的要求。
新来了一个访问者
,就需要一个新的抽象角色和真实角色
,而代理角色就需要对新的抽象角色进行实现
,因而每多一个访问者
,就需要对代理角色
进行修改
。在使用的时候动态的创建代理类
和真实实例
可以理解为商家(真实对象)
和淘宝要求商家的规则(抽象对象)
和淘宝(代理对象)
,顾客相当于访问者
。
灵活性更高
动态代理
要使用Java的反射机制
,所以既然用到了反射必然运行效率上
会比静态代理效率低
。
Proxy 相当于淘宝里的商家 InvocationHandler 相当于淘宝要求商家对客户服务提的规范
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(代理类),而是在运行的时候产生,从而调用代理类的方法,这就是动态代理。
最后送一句话给自己也与各位共勉
行百里者半九十,不要轻易自满,永远记得坚持超越自己,加油!!!