Play类加载器和热加载机制

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;

相关文章
相关标签/搜索