使用javaassist之类的API执行字节码操作,在编译后修改类文件。但是,如果优化了java代码,那么修改是否会在错误的地方执行?有办法避免这个问题吗?常规Java和Android之间的故事有什么不同吗?
答案 0 :(得分:2)
典型的Java程序被多次编译。第一步,Java 源代码被翻译成Java 字节代码。第二步,将Java字节代码转换为机器代码。
此过程的详细信息当然取决于运行代码的虚拟机。例如,早期版本的Java不包括所谓的即时编译器。在这种情况下,字节代码被逐条指令解释,其中字节代码操作当然可以对性能产生影响。但这不再是真的。 OpenJDK的HotSpot虚拟机以及Android的 ART 和 DEX 运行时都执行字节代码的优化。
将源代码转换为字节代码的javac编译器执行的优化很少。您通常不应担心 to-byte-code 转换步骤对性能的影响。但是,在某些情况下,运行时代码生成所产生的字节代码会对性能产生影响。当即时编译器观察到难以优化的字节代码时会发生这种情况。通常,这是由难以优化的不必要的对象分配引起的。
如果你想查看这个问题的细节,我已经在这个演讲中谈了一下这个问题:https://www.youtube.com/watch?v=XMY6HA7_h5Y
至于安全性:只要字节码操作不会破坏字节码,就没有问题。如果它确实破坏了字节代码,Java虚拟机将拒绝使用损坏的代码加载类。这对于HotSpot和Android都是如此,它可以在加载类之前验证任何字节代码。