在说动态代理之前要先了解一下他的由来
静态代理扩展能力差,可维护性差,所以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(代理类),而是在运行的时候产生,从而调用代理类的方法,这就是动态代理。
最后送一句话给自己也与各位共勉
行百里者半九十,不要轻易自满,永远记得坚持超越自己,加油!!!