一.前言

说到语言的动态性,这个是脚本语言的一大优势,没有中间环节,源码即时执行。大家一般不会把它和java联系在一起,从java本身语言来看,java确实具有脚本语言的一些特性,即可以即时编译和执行。java相关的动态加载技术也非常的成熟,在android客户端,可以用这种技术热修复,动态替换有bug的相关代码;在服务端也有广泛的应用,像java的插件技术,感兴趣的可以参考 https://github.com/pf4j/pf4j ;包括我们使用的开发工具,比如idea的热替换,帮助我们在开发过程中,修改完代码热替换文件,不用每次都重启项目。但是java的热替换有一些限制,比如不能修改方法的签名,只能修改方法体里面的内容。

二.demo

示例代码是简化后的,完整的参考https://github.com/jsdman/dynamic-code

我们结合springboot框架简单展示下动态加载代码技术的具体实现。动态加载代码的核心是类加载引擎,该类的作用是动态加载类的源文件,编译成class文件并且加载到jvm中。



public



再定义一个接口类,我们的动态加载的类都是继承于这个接口。



public



写个controller提供动态加载的入口和我们动态加载类的执行动作。



@RestController



再做个html页面去测试下我们的动态加载好使不:




Java动态加载echarts java动态加载源码_ligertoolbar 动态加载按钮


我们点击动态加载按钮,然后点击say:


Java动态加载echarts java动态加载源码_java_02


say返回字符串修改下,动态加载:


Java动态加载echarts java动态加载源码_ligertoolbar 动态加载按钮_03


我们点击动态加载按钮,然后点击say,可以看到返回值是我们动态定义的类了。


Java动态加载echarts java动态加载源码_Java动态加载echarts_04


也可以在代码里面加任意的其他代码,比如我想在执行前打印一些日志:


Java动态加载echarts java动态加载源码_动态加载_05


我们点击动态加载按钮,然后点击say,可以看到控制台打印出我们的代码了


Java动态加载echarts java动态加载源码_github_06


三.demo地址

jsdman/dynamic-codegithub.com

Java动态加载echarts java动态加载源码_动态加载_07


四.应用场景

大家可以一起讨论下,是否有一些场景可以应用此方式进行开发。