java啓動參數:
java
-javaagent:"../play-1.2.4/framework/play-1.2.4.jar"app
play-1.2.4.jar元信息文件:代理
Premain-Class: play.classloading.HotswapAgent
Can-Redefine-Classes: truessl
HotswapAgent類:ci
public class HotswapAgent {
static Instrumentation instrumentation;
public static boolean enabled = false;
public static void premain(String agentArgs, Instrumentation instrumentation) {
HotswapAgent.instrumentation = instrumentation;
HotswapAgent.enabled = true;
}
public static void reload(ClassDefinition... definitions) throws UnmodifiableClassException, ClassNotFoundException {
instrumentation.redefineClasses(definitions);
}
}rem
經過java代理,使得虛擬機在啓動後,具有了熱加載的能力。
虛擬機
自定義類裝載器
it
public class ApplicationClassloader extends ClassLoader {
io
public void detectChanges() {編譯
for (ApplicationClass applicationClass : modifiedWithDependencies) {
if (applicationClass.compile() == null) { 《=======先編譯
} else {
applicationClass.enhance(); 《=======後加強
if (newDefinitions.size() > 0) { Cache.clear(); if (HotswapAgent.enabled) { try { HotswapAgent.reload(newDefinitions.toArray(new ClassDefinition[newDefinitions.size()])); 《=======而後再加載,完成一次熱啓動 } catch (Throwable e) { throw new RuntimeException("Need reload"); } } else { throw new RuntimeException("Need reload"); } }