Play类加载器和热加载机制

一、热加载部分

1.hotswap的发生时间

dev模式下,每次请求的处理过程中

 

2.hotswap的实现机制:

具体可以参考play.classloading.ApplicationClassloader类的detectChanges方法。

2.1如何侦测文件的变化

play自己实现的classloader记录了上一次加载class文件的时间和class文件的修改时间,和play项目中的class文件的修改时间做对比,如果在上一次加载之后修改时间有更新,则需要重新加载这个类文件。

2.2如何替换class文件

使用java.lang.instrument的接口,动态替换JVM中已加载的class文件

3.对业务开发的影响

如果有类文件使用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的类,将会交由系统默认的类加载器来加载。由系统默认类加载器加载的类文件在热加载中不会被替换。

二、增强部分

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;

 


转载于:https://my.oschina.net/u/923508/blog/389540

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值