JDK的动态代理,使用最经典的应该是spring AOP,默认情况下,Spring AOP的实现对于接口来说就是使用的JDK的动态代理来实现的,而对于类的代理使用CGLIB来实现(具体可看Spring AOP的实现).
通过JDK的动态代理,可以为任意的JAVA对象创建代理对象.
下面我们看一个简单的demo:
|
|
输出结果:
|
|
从上面可以看出,JDK的动态代理使用起来非常简单,但是看起来又很让人很费解,下面我们看一下Proxy源码中的newProxyInstance方法
|
|
下面再进getProxyClass方法看一下
我们可以在proxyClassCache.get()的具体方法中发现,没有缓存的代理类是通过ProxyClassFactory的apply方法创建
|
|
下面看一下ProxyGenerator的generateProxyClass方法
从上面可以知道,我们把sun.misc.ProxyGenerator.saveGeneratedFiles这个系统属性为true来会生成的class保存到本地,代码如下:
|
|
生成class文件路径:
下面看一下class文件内容:
通过上面的class文件我们可以知道,代理对象是通过DynamicProxyHandler的invoke方法来调用ProxyService接口中的printContent方法,到这里整个代理过程就完了。
代码地址:JDK动态代理demo