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"); } }