類加載與動態代理

動態代理java

所謂動態,就是在運行期間生成代理類。否則,有100個須要被代理的類,你就得手動寫100個代理類,代碼膨脹得厲害。代理

而我如今的目標是弄清楚jdk如何實現動態代理。接口

閱讀Proxy類的源碼可以看清大致流程:源碼

一、咱們本身提供接口和類加載器,而後jdk去經過Class.forName的方式去加載以及初始化這些接口,並生成類型信息。io

二、有了這些接口的類型信息,就能夠經過反射獲得全部的方法的信息編譯

三、這個時候有2種選擇:經過已有的信息生成代理類的java源代碼文件,而後動態編譯生成class文件。class

而jdk用的是另外一種,將已有信息直接寫入class文件。由於class文件的內容分佈是固定的,因此按照class文件的格式一個一個的寫二進制流就能夠實現。效率

相比第一種,第二種的效率更高。原理

四、有了class文件,就能夠調用defineClass方法生成代理類的類型信息jdk

五、有了代理類的類型信息,就能夠經過反射調用參構造方法,把咱們自定義的InvocationHandler傳進去,生成代理類的實例。

 

經過動態代理的實現原理,能夠清楚的看到:類加載機制相對靈活,只要你能獲得符合規範的class文件,就能夠生成對應的類型信息,而後經過反射就能夠幹不少事情。

可是動態代理的惟一遺憾是必需要實現接口,而另外還有一種方式---cglib,能夠更加靈活的實現動態代理。關於cglib,且聽下回分解。

相關文章
相關標籤/搜索