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;