Java代码变动怎么解决?热修复及调试如何实现?对于Java语言来讲,若是涉及代码变动,通常状况下会选择从新启动JVM来修复问题。然而从新启动意味着须要一些时间才能将异常修复,热修复的出现为实现秒级恢复故障创造了可能,接下来就给你们讲解一下。正则表达式
Java热修复编程
目前较火的热修复方案大体分为两派:阿里系:DeXposed、andfix:从底层二进制入手(C语言);腾讯系:tinker:从Java加载机制入手。今天主要讲解基于Java加载机制,来研究热修复的实现方法。数组
安卓的类加载器在加载一个类时会先从自身DexPathList对象中的Element数组中获取(Element[] dexElements)到对应的类,以后再加载。在for循环中,首先遍历出来的是dex文件,而后再是从dex文件中获取class,因此,咱们只要让修复好的class打包成一个dex文件,放于Element数组的第一个元素,这样就能保证获取到的class是最新修复好的class。学习
热修复的实现步骤:debug
一、获得dex格式补丁。修复好有问题的Java文件(根据bug的实际状况修改代码便可);将Java文件编译成class文件;将class文件打包成dex文件(dx指令程序)。3d
二、加载dex格式补丁。调试
三、加载jar、apk、zip格式补丁。注意这类压缩包中必须放着一个dex文件,并且对名字有要求,必须是classes.dex。对象
Java-debugblog
Java-debug-tool提供了多个trouble-shot命令,但杀手级的命令就两个,methodTrace和redefineClass。ip
methodTrace命令,用于快速问题发现,能够作到不暂停JVM而获取到方法调试信息。基本格式:
mt -c -m
可选参数:-d -t -i -n -time -u等。
redefineClass命令,能够作到不重启JVM而进行类字节码替换,实现方法热修复。当使用mt命令定位到问题以后,修复了的代码若是须要快速上线,那么就可使用该命令。命令的使用格式为:
rdf -p [className1:class1Path className1:class2Path]
findClass命令,它能够在目标JVM找到你须要的类,而且告诉你类的具体信息,好比类是否已经加载?若是加载,那么加载类的classLoader是哪个等。这个命令能够容许你不输入类的全限定名,并能够容许你输入正则表达式去匹配类。
想成为高薪Java工程师,你须要理论与实战兼备,而良好的知识基础是你高效率学习、付诸实战的前提。若是你想更好的学习Java编程,能够选择专业的学习方式。