play中的热启动

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

相关文章
相关标签/搜索