動態代理java
所謂動態,就是在運行期間生成代理類。否則,有100個須要被代理的類,你就得手動寫100個代理類,代碼膨脹得厲害。代理
而我如今的目標是弄清楚jdk如何實現動態代理。接口
閱讀Proxy類的源碼可以看清大致流程:源碼
一、咱們本身提供接口和類加載器,而後jdk去經過Class.forName的方式去加載以及初始化這些接口,並生成類型信息。io
二、有了這些接口的類型信息,就能夠經過反射獲得全部的方法的信息編譯
三、這個時候有2種選擇:經過已有的信息生成代理類的java源代碼文件,而後動態編譯生成class文件。class
而jdk用的是另外一種,將已有信息直接寫入class文件。由於class文件的內容分佈是固定的,因此按照class文件的格式一個一個的寫二進制流就能夠實現。效率
相比第一種,第二種的效率更高。原理
四、有了class文件,就能夠調用defineClass方法生成代理類的類型信息jdk
五、有了代理類的類型信息,就能夠經過反射調用參構造方法,把咱們自定義的InvocationHandler傳進去,生成代理類的實例。
經過動態代理的實現原理,能夠清楚的看到:類加載機制相對靈活,只要你能獲得符合規範的class文件,就能夠生成對應的類型信息,而後經過反射就能夠幹不少事情。
可是動態代理的惟一遺憾是必需要實現接口,而另外還有一種方式---cglib,能夠更加靈活的實現動態代理。關於cglib,且聽下回分解。