今天,我在我的 openjdk 7 上使用 javaagent 和检测来探索大型应用程序的类(例如带有应用程序的 jboss 服务器)。我每 10 秒对所有类调用一次重新转换,因此它们的字节码进入了我的 ClassFileTransformer 实现。
我的实现只是跟踪类的字节码如何随时间变化。首先,令我感到惊讶的是,字段和方法的顺序、方法访问修饰符、常量池的内容和其他诸如此类的事情因一项检查而异。但是,它仍然被记录在案。
没有记录的内容 - 某些项目可能在类的常量池中创建并注入到方法中。现在我注意到数值(Longs、Doubles、Floats 等)会发生这种情况。
这就是它在 javap 中的样子;前:
pool:
...
#17 Float NaNf
method:
#1 fload #17 //NaNf
...
在运行时更改类之后:
pool:
...
#17 Float NaNf
#18 Float NaNf
method:
#1 fload #18 //NaNf <- look, it loads #18 now
我仔细检查过,没有连接其他变压器或代理。
为什么 JVM 不能让我的字节码保持不变?我在哪里可以了解此类优化/转换(或者还有什么)?我阅读了 JVM 源代码,但这些只会让我更加困惑。
我只是想创建某种实时字节码验证器——一种安全工具。