动态代理
在程序运行时创建实现了给定的接口的新类。
动态代理实现是通过字节码增强方式实现的,字节码增强又有两种方式实现
- 生成新类并实现被代理类的所有接口(spring aop是这种方式)
- 直接篡改class类文件后重新加载到java虚拟机
主要用来做方法的增强,可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何想做的事情,因为在InvocationHandler的invoke方法中会通过反射机制执行委托类的方法。
应用在很多场景里比如:方法调用时想要记录日志,权限查看,事务管理之中,这些都不需要改动原来方法,而只需要在代理类中添加,具体下面的例子说明。
例子
程序中实现动态代理关键是使用Proxy类和实现InvocationHandler接口的invoke()方法(方法里是具体的方法执行)
ProxyFacade1.java和ProxyFacade2.java
|
|
ProxyFacadeImpl.java实现两个接口
AOPHandler.java
ProxyTest.java测试类
打印输出一下内容,因为真正的执行方法是AOPHandler的invoke方法代理执行的
动态代理源码简单分析
Proxy.newProxyInstance重点代码在WeakCache
Proxy$ProxyClassFactory.java生成字节码文件并加载到jvm
Proxy$ProxyClassFactory.java
最终会生成$ProxyClass文件 这里省略equals和toString和hashCode方法
最后看下uml关系图