可爱的字节码&修改
2020-01-28 本文已影响0人
摸摸脸上的胡渣
1.为什么要修改字节码
字节码是java多平台运行的根本原因,程序运行的状态和结果都由字节码决定。
所以控制了字节码,就控制了程序 —— 赤木刚宪
除了手写java代码,再编译成字节码外,还有哪些能够控制字节码的方法呢?
2.修改字节码的方式
2.1 ASM
ASM是修改字节码的工具库,拥有众多的API,其中总共可以分为三类。
加载字节码,修改字节码,替换字节码。分别对应ClassReader,Visitor,ClassWriter。
注意:ASM是去修改字节码,但是字节码比较晦涩难懂,有没有能够通过修改java代码的方式来更改字节码的工具呢?
2.2 Javasist
Javasist能够通过修改java代码来达到修改字节码的目的,与ASM类似,主要由两个组件,ClassPool和CtXXX(Ct代表compile-time),具体的写法,可以参考git,直接运行这个类即可。
public class JavassistTest {
public static void main(String[] args) throws NotFoundException,
CannotCompileException, IllegalAccessException, InstantiationException, IOException {
ClassPool cp = ClassPool.getDefault();
// cp.insertClassPath(new ClassClassPath(Base.getClass()));
CtClass cc = cp.get("byteCode.Base");
CtMethod m = cc.getDeclaredMethod("process");
m.insertBefore("{ System.out.println(\"start\"); }");
m.insertAfter("{ System.out.println(\"end\"); }");
Class c = cc.toClass();
cc.writeFile("/Users/wushuangxiaoyu/temp/demo/src/main/java/");
Base h = (Base)c.newInstance();
h.process();
}
}
https://github.com/LigthRain/demo/blob/master/src/main/java/byteCode/JavassistTest.java