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

相關文章
相關標籤/搜索