参考:https://blog.csdn.net/zhaohongfei_358/article/details/101267843
自动装箱和拆箱
使用javassit插入代码时,需要编写装箱和拆箱的操作,比如int->Integer
需要这么写:Integer i = new Integer(3);
热部署实现的关键
同一个类字节文件,classLoader类加载器只能加载一次,多次会报错。这样的话 ,我们就不能通过类加载器重新加载改动后的类,只能通过javaAgent的方式去动态加载
使用javaAgent,再结合javassit来修改类字节,从而实现类的动态加载
CtClass clazz = classPool.get(classname);
CtMethod ctMethod = clazz.getDeclaredMethod("mock");
ctMethod.setBody("{ return 123;}");
//重新创建新的ClassDefinition,注意第一个参数,获取的当前类加载器加载的类,第二个参数是修改过后的类字节码
ClassDefinition classDefinition = new ClassDefinition(Class.forName(clazz.getName()),
clazz.toBytecode());
// 使用Instrumentation 重新加载类描述
inst.redefineClasses(classDefinition);
maven打包时,使用父类根路径
project.parent.basedir