怎么可能去寻找内存中正在运行的java程序存储它运行的字节码?我很欣赏这可能会或者可能不会令人难以忍受。
答案 0 :(得分:2)
查看本机函数java.lang.ClassLoader.defineClass1(String, byte[], int, int, ProtectionDomain, String, boolean)
这是一个特定的虚拟机,所以没有通用的解决方案。
如果您想查看字节代码,只需将该类作为资源加载(例如getClass().getClassLoader().getResourceAsStream('java/lang/String.class')
),并使用ASM或类似工具分析该流。
如果你想在运行时修改字节代码:祝你好运。虚拟机已经加强了抵御这种攻击的能力,所以即使你可以获得内存位置,也很可能会发生变化。
请注意,调试器不会修改内存,它们使用特殊的类加载器(或内置类加载器的功能),当有人在IDE中更改源代码时请求类时返回不同的结果。但这是有限的。例如,某些VM在加载一次类之后无法更改方法的数量和/或参数。
答案 1 :(得分:1)
您可以尝试使用调试器运行jvm,然后在加载类之后,在分配的内存中搜索字节代码模式,可以在加载的类文件中找到。
jvm可能决定及时编译字节代码然后它可能决定释放为字节代码分配的内存(因为它不再需要)。所以你可能会或者可能不会在内存中找到字节代码。
答案 2 :(得分:1)
当JVM读取字节代码时,它会在多个阶段对其进行按摩,直到它最终生成本机代码(它可能会多次执行)尝试查找某处是存储字节代码并更改它的内存没有做任何事情,因为它可能不直接使用字节码(甚至不保留它)
如果您想动态更改字节代码,我建议您在加载字节代码之前进行检查,或者使用旨在更改字节代码的Instrumentation,并在发生这种情况时触发正确的行为。
虚拟地使用字节代码,不能保证它对真实机器有任何意义(这是你在“C”级别看到的)