- Class.forName和ClassLoader.loadClass - 简书
- Eclipse安装热部署热加载插件JRebel(免费版————idea也可用) - that summer - CSDN博客
- Eclipse中使用JRebel实现项目热部署(Maven插件版) - LinWenLi - 博客园
- java程序如何实现hotswap - 简书
- Springloaded使用方法 - 唐震宇的博客 - CSDN博客
- Tomcat热部署的实现原理 - FreeMan。 - 博客园
- 揭秘Java热部署原理及JRebel(Hotcode)的实现原理 - dai.sp - 博客园
- 使用javassist运行时动态重新加载java类及其他替换选择 - weixin_34355881的博客 - CSDN博客
- 探秘 Java 热部署二(Java agent premain) - 莫那-鲁道 - 博客园
- 探秘 Java 热部署三(Java agent agentmain) - 莫那-鲁道 - 博客园
- Java_java动态编译整个项目,解决jar包找不到问题
- 慎用动态编译
总结
classLoad 只能热加载反射运行的类。
javassist的toClass()可以实现。new 级别的热替换。但是必须是在第一次对Class加载之前。
所以可以得到结论,如果类加载到jvm了,再想替换new级别的操作就困难了。
agent 可以在jvm程度上对类进行重新装载,到达new的热替换。
Springloaded 也是用的agent的方式。
比较成熟的热加载方案。
classLoad 热加载反射运行的类 >> asm把所有new改成classLoad.loadClass()…newInstance(…)的方式 >>
在所有类初始化之前这样做,就可以代替new关键字, 1.最好使用jdk-agent方式。 2.在main之前把线程的classLoad替换。
Class.forName和ClassLoader.loadClass
如果想让Class.forName和自定义的ClassLoader.loadClass执行一样。
必须保证A.getClass.getClassLoader是同一个。