Play類加載器和熱加載機制

1、熱加載部分java

1.hotswap的發生時間多線程

dev模式下,每次請求的處理過程當中app

 

2.hotswap的實現機制:框架

具體能夠參考play.classloading.ApplicationClassloader類的detectChanges方法。工具

2.1如何偵測文件的變化線程

play本身實現的classloader記錄了上一次加載class文件的時間和class文件的修改時間,和play項目中的class文件的修改時間作對比,若是在上一次加載以後修改時間有更新,則須要從新加載這個類文件。代理

2.2如何替換class文件繼承

使用java.lang.instrument的接口,動態替換JVM中已加載的class文件接口

3.對業務開發的影響ssl

若是有類文件使用java默認的classloader或者本身的classloader進行加載,在開發模式下會帶來沒法熱加載的問題,須要注意。

在ApplicationCompiler中有加載類的方法,經過java類的package路徑來決定使用哪一種類加載器,參見內部類INameEnvironment。

 

if (name.startsWith("play." ) || name.startsWith("java.") || name.startsWith("javax." )) {

    byte[] bytes = Play.classloader.getClassDefinition (name);

    if (bytes != null) {

        ClassFileReader classFileReader = new ClassFileReader(bytes, name.toCharArray(), true);

        return new NameEnvironmentAnswer(classFileReader, null);

    }

    return null ;

}

這幾種package的類,將會交由系統默認的類加載器來加載。由系統默認類加載器加載的類文件在熱加載中不會被替換。

2、加強部分

1.爲何要有加強

藉助加強,在保持框架代碼簡單清晰的基礎上,透明化地保證程序運行正常,提供參數自動綁定和高效查找,屏蔽一些多線程等容易出錯的代碼,提升框架的易用性。

另外一方面也提升了框架的維護成本,開發人員會感到困惑。

2.共有幾種加強

見play.classloading.enhancers目錄

3.如何實現加強

3.1在運行時的何時加強

經過Play本身實現的classloader來加載class文件,在加載完成時進行加強,獲得加強後的class文件

3.2經過什麼方式進行加強

藉助javasssist字節碼修改工具。能夠對class文件進行如下的操做:

運行時動態建立類

運行時修改class文件,增長新方法,在已有方法中增長代碼

對某些調用增長切面,動態代理,如fieldAccess(訪問屬性),methodCall(方法調用)

定義本身的加強 ,直接繼承enhancer類,實現enhanceThisClass方法

 

/**

 *  在這個方法內對類文件進行修改/加強

 */

 public abstract void enhanceThisClass (ApplicationClass applicationClass) throws Exception;

相關文章
相關標籤/搜索