请教下 Java 热替换代码的技术

2022 年 9 月 23 日
 8629
场景:把接收处理数据的类 源码放在 web 后台页面中在线编辑,编辑完这个类直接提交到 redis 中。然后线上服务就替换了这部分代码,不需要打包发布实现了更新服务。
请问这是什么技术,什么关键字可以查询,有没有现成的 demo 可以学习下。感谢!
7458 次点击
所在节点    Java
59 条回复
xiangxiangxiang
2022 年 9 月 23 日
groovy 脚本+1 之前有场景就是 m 端维护 /发布代码块,然后在 c 端动态加载生效
Vegetable
2022 年 9 月 23 日
标准的 RPC API 、自动构建、容器化
virusdefender
2022 年 9 月 23 日
yuanliubei
2022 年 9 月 23 日
coala
2022 年 9 月 23 日
类似 JSP 呗.
ryanbuu
2022 年 9 月 23 日
grpovy 啊…
paullee
2022 年 9 月 23 日
花这些功夫,用 k8s 部署,滚动更新,不是更舒服?
ggbond2
2022 年 9 月 23 日
humpy
2022 年 9 月 23 日
可以做,jdk 提供了 JavaCompiler ,可以在运行时编译代码,将编译后的代码存在内存里,再实现一个 ClassLoader ,就能加载刚编译的类了。

可以参考一下这篇文章,好像是微博的老师写的:
https://zhenbianshu.github.io/2019/12/play_with_java_dynamic_compile.html
humpy
2022 年 9 月 23 日
misaka19000
2022 年 9 月 23 日
可以用 ASM 动态替换字节码来做,或者用 ByteBuddy 使用更高级一些的 API
molika
2022 年 9 月 23 日
jvm 上用 Clojure 天生支持
codehz
2022 年 9 月 23 日
还记得之前的 jndi 漏洞吗(
听着就是在造 RCE(
xuanbg
2022 年 9 月 23 日
能搞!办法还不少,但没一个是安全的。想想也知道,这就相当于代码不经过审查和测试就直接上线,我写几个漏洞也是没什么问题的吧?谁还不写几个 bug 呢。。。
nothingistrue
2022 年 9 月 23 日
@wangxiaoaer #8
@superchijinpeng #10
仔细看:“编辑完这个类直接提交到 redis 中”,“不需要打包”。这是想源码一步到底的,Classloader 可 load 不了。
superchijinpeng
2022 年 9 月 23 日
@nothingistrue URLClassLoader ,参考 Spark 或者 Flink 动态注册或移除 UDF
zhang77555
2022 年 9 月 23 日
JavaCompiler 把代码编译成 class 然后 URLClassLoader 加载
建议定好接口和编码模板校验,免得这部分功能被滥用
selca
2022 年 9 月 23 日
@codehz #33 私有的东西,目的就是造一个门去调,如果操作者能控制好鉴权,还是没问题的
dddyyyttt
2022 年 9 月 23 日
为什么没人提 arthas ?
wangxiaoaer
2022 年 9 月 23 日
@nothingistrue 我理解他的意思是 java 代码存到 redis ,但是肯定不能和直接用,后台可以从 redis 读这些代码编译,替换。

如果想直接从 redis 加载 java 文件就替换运行,那肯定是不行的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/882334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX