说明:本文主要从理论上简单抽象的解释动态代理的实际过程与优点,本文是个人对动态代理的理解,希望能帮到学习的小伙伴们,如有问题,请不吝赐教,谢谢。
1、何为代理?
解释:做好的东西(被代理类方法)不自己调用,而是交由别人(代理类)调用,这样别人还能在不改变你原本东西的基础上进行加工处理。
举例:被代理类实现了一个具体业务的方法,而代理类可以给这个方法加上事物控制。
好处:(1)代理类可以专注于实现自己的功能,一些公有的操作可以交给代理类来做。
(2)可以在不改变代理类源码的基础上对其增加一些特性。
2、动态代理与静态代理的区别
静态代理:代理类提前写好源码,编译使用。
动态代理:代理类字节码是由程序运行时根据被代理类的信息创建的,投入使用。
3、基于接口的动态代理的实现过程与理解
(1)根据被代理类的信息来创建代理类(信息包括同一个类加载器,实现同一个接口)
(2)因为实现的是同一个接口,所有代理类与被代理类具有接口中相同的方法签名(方法签名包括方法名与参数)
(3)主要过程:在需要调用被代理类的某个方法时,不直接调用它,而是转而去调用代理类中的同名方法,在该方法中再用调用
的代理类方法签名来反射调用被代理类中相应的方法(基于过程2),并在该方法执行前、后、异常时做相应处理,这就是对代理
类中方法的增强。(所谓增强,并没有在被代理类方法的中间插入代码,而是在方法执行前、后、出现异常时插入额外的代码)
总结:所谓代理,就是去调用代理类的同名方法,所谓增强,就是在该同名方法中做一些额外的操作。
好处:(1)不改变原方法的源码
(2)如果很多方法都需要这个额外的操作,可以在代理类中只写一遍,就是无论你调用被代理类的什么方法,我都在被
代理类中执行需要的操作,再反射调用同名方法。
public class Client extends Thread{
public static void main(String[] args) {
final IAgent factory=new ComputerFactory();
IAgent proxyFactory= (IAgent)Proxy.newProxyInstance
(factory.getClass().getClassLoader(),
factory.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws
Throwable {
//额外处理
//.....
//反射调用代理类中的同名方法,得到结果
Object result=method.invoke(factory,args[0]);
//额外处理
//.....
//返回结果
return result;
}
});
proxyFactory.sale(1000f);
}
}
这是JDK自带的一种基于接口实现的动态代理,Proxy类中利用被代理类factory提供的类加载器,接口信息创建了一个使用相同类
加载器实现相同接口的新类proxyFactory,称为”代理类“,因为是实现相同接口,所有代理类对象拥有被代理类对象的相同方法签
名,在调用代理类的任何方法时,都会去执行实现了InvocationHandler接口并重写的invoke方法,在该方法中再用调用的代理类
方法签名来反射调用被代理类中相应方法,并在该方法执行前、后、异常时做相应处理,这就是对代理类中方法的增强。这样在
实际使用时,创建代理类对象,调用对象的方法即可。可以结合这段代码就能理解动态代理的所有过程了。
以上就是本人对动态代理的理解。