字节码操作是否安全

Jus*_*ins 6 java android bytecode-manipulation javassist java-bytecode-asm

使用像javaassist这样的API执行字节码操作,在编译后修改类文件.但是,如果优化了java代码,那么修改是否可以在错误的地方执行?有办法避免这个问题吗?常规Java和Android之间的故事有何不同?

Raf*_*ter 5

一个典型的 Java 程序会被多次编译。第一步,Java源代码被翻译成 Java字节码。第二步,Java 字节码被翻译成机器码

这个过程的细节当然取决于运行代码的虚拟机。例如,Java 的早期版本不包括所谓的即时编译器。在这种情况下,字节码是逐条指令解释的,其中字节码操作当然会对性能产生影响。但这不再是事实。OpenJDK 的 HotSpot 虚拟机以及 Android 的ARTDEX运行时都执行字节码的优化。

将源代码转换为字节码的 javac 编译器执行的优化很少。您通常不应该担心到字节码转换步骤的性能影响。但是,在某些情况下,运行时代码生成所产生的字节码会对性能产生影响。当即时编译器观察到难以优化的字节码时,就会发生这种情况。通常,这是由难以优化掉的不必要的对象分配引起的。

如果你想看看这件事的细节,我已经做了这个演讲,我在那里谈了一下这个问题:https : //www.youtube.com/watch?v=XMY6HA7_h5Y

至于安全性:只要字节码操作不破坏字节码,就没有问题。如果它确实损坏了字节码,Java 虚拟机将拒绝加载带有损坏代码的类。HotSpot 和 Android 都是如此,它们在加载类之前验证任何字节码。