可爱的字节码&修改

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

上一篇 下一篇

猜你喜欢

热点阅读