网站建设需要注意的问题,wordpress the_terms,wordpress怎么设置页面换页,实训报告网站开发思路
当一个java的类文件发生变更#xff0c;如果动态的热更新这个新的类文件#xff1f;目前来说#xff0c;有两种可能的方式
新增一个自定义ClassLoader#xff0c;名为NC#xff0c;让NC去load这个新的类文件#xff0c;这样就完成了新的类定义的替换 但目前Java有…思路
当一个java的类文件发生变更如果动态的热更新这个新的类文件目前来说有两种可能的方式
新增一个自定义ClassLoader名为NC让NC去load这个新的类文件这样就完成了新的类定义的替换 但目前Java有一种特性ClassLoader不支持卸载一个已装载的类且ClassLoader是基于双亲委派机制来加载一个类的字节码文件的。这就导致一个问题自定义的ClassLoader应该更新一个名为 findClass 的父类方法让自定义的ClassLoader不要向父级ClassLoader去询问这个类是否已加载过否则就会抛出企图重复定义同名类的异常。如何保证所有对象都经过自定义ClassLoader去加载目前来说可以通过JDK 7中引入的 WatchService 的方式监听项目中的class文件变更获取其字节码文件让其通过自定义ClassLoader去 loadClass这种方式用来动态更新类定义的弊端过大每次类文件发生变更就需要新建一个ClassLoader去loadClass 通过 javaagent 的方式创建 Transformer 通过 Instrumentation 对象提供的 redefineClasses 方法用这种方式将监听到的类文件变更后的字节码文件转为 byte[] 格式让其重新定义这种方式相比较第一种方法更为高效可靠。 Galois 通过监听项目代码变更使用 redefineClasses 方法来重新装载类并通过 ASM 侵入 SpringBoot 框架 和 MyBatis 框架核心代码的方式获取到能重新装载 Bean 或 Mapper 的核心对象以此实现项目的代码热部署更新。