在前面的文章里分别都说过了instrument和Hotswap, 显然这俩个技术在代码热更方面都有比较大的局限性. 今天测试一下Spring出品的Spring-loaded. 它可以动态地添加删除方法, 属性字段等.
Spring-loaded 的用法非常简单, 下载springloaded.jar这个jar包, 然后使用代理的方式将它挂载到JVM上就可以了.
1 | java -javaagent:<pathto>/springloaded.jar -noverify SomeJavaClass |
尽管有了很高的灵活性,但是还是多少稍微有一些限制, 如果想要reload的文件不能以下列字符串开头
1 | antlr/ |
还可以设置一些系统参数
1 | java -Dspringloaded=explain -javaagent:<pathto>/springloaded.jar -noverify SomeJavaClass |
explain
mode会输出无法reload的诊断信息,例如
1 | Feb 05, 2014 11:00:51 AM org.springsource.loaded.TypeRegistry couldBeReloadable |
除了explain
还有verbose
模式, 这个模式会使用java.util.Logging
输出reload过程详细信息.
1 | Watcher Observed last modification time change for /Users/aclement/play/grails10411/jira-reload/target/classes/br/ |
当然, 上面俩个模式并不是互斥的, 我们可以对spring-loaded指定多个参数
1 | -Dspringloaded=verbose;explain;profile=grails |
看到了这么多, 其实还有一些特性没有测试到, 但是不想再自欺欺人了, 只有一个原因-noverify
, 它关闭了JVM的字节码检查功能, 它让JVM坐上火箭去了月球