如何在java程序中捕获读写?

时间:2011-07-25 21:25:30

标签: java instrumentation jvmti javaagents

我正在尝试创建一个可以捕获java程序所做的所有读写操作的工具。另外,我想知道访问/修改哪个对象的哪些字段。

我目前看了: -

1)java.lang.instrument 我不能做那么多。我无法理解如何编写一个代理,可以访问正在运行的程序,并在不同的对象/字段和任何相关的东西上创建一个监视。如果您对此有任何想法或信息,我将不胜感激。

2)jvmti 我查看了jvmti并试图创建一个jvmti工具,但我发现要获取对象,我需要JVMTI_EVENT_OBJECT_ALLOC是一个潜在的功能。但是,我认为,事实并非如此。此外,我读到 new 命令不会调用此事件。因此,目前,即使这似乎也不适用。

所以,我想知道你们是否知道我想做什么,或者使用上面提到的方法或你可能知道的任何其他技术/工具?

注意:我无权访问应用程序的源代码。全部,我有类文件。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

使用ASM lib非常容易。创建一个新的类加载器,在加载它们之前检测所有类,并使用它来加载目标类。创建一个新的MethodAdapter并覆盖visitFieldInsn方法。然后查找PUTFIELDPUTSTATICGETFIELDGETSTATIC操作码。虽然这可能看起来很可怕(因为我的解释很可能是胡言乱语),但事实上这很容易。只需下载ASM手册,您就会知道如何立即完成。

编辑:我忘了告诉它为了能够拦截JDK代码完成的读写操作,你必须检测这些类,将它们保存到文件中并使用修改后的引导类路径运行JVM,通过命令行参数-Xbootclasspath(java。*和其他一些软件包;我相信至少sun。*和javax。*也需要这个。)

这也可以用于AspectJ ...但我不确定。