我正在尝试创建一个可以捕获java程序所做的所有读写操作的工具。另外,我想知道访问/修改哪个对象的哪些字段。
我目前看了: -
1)java.lang.instrument 我不能做那么多。我无法理解如何编写一个代理,可以访问正在运行的程序,并在不同的对象/字段和任何相关的东西上创建一个监视。如果您对此有任何想法或信息,我将不胜感激。
2)jvmti 我查看了jvmti并试图创建一个jvmti工具,但我发现要获取对象,我需要JVMTI_EVENT_OBJECT_ALLOC是一个潜在的功能。但是,我认为,事实并非如此。此外,我读到 new 命令不会调用此事件。因此,目前,即使这似乎也不适用。
所以,我想知道你们是否知道我想做什么,或者使用上面提到的方法或你可能知道的任何其他技术/工具?
注意:我无权访问应用程序的源代码。全部,我有类文件。
答案 0 :(得分:1)
检查这些:
http://download.oracle.com/javase/6/docs/technotes/guides/management/jconsole.html
http://java.sun.com/developer/technicalArticles/J2SE/jconsole.html
http://jamonapi.sourceforge.net/
http://www.manageengine.com/products/applications_manager/java-runtime-monitoring.html
答案 1 :(得分:1)
使用ASM lib非常容易。创建一个新的类加载器,在加载它们之前检测所有类,并使用它来加载目标类。创建一个新的MethodAdapter并覆盖visitFieldInsn
方法。然后查找PUTFIELD
,PUTSTATIC
,GETFIELD
和GETSTATIC
操作码。虽然这可能看起来很可怕(因为我的解释很可能是胡言乱语),但事实上这很容易。只需下载ASM手册,您就会知道如何立即完成。
编辑:我忘了告诉它为了能够拦截JDK代码完成的读写操作,你必须检测这些类,将它们保存到文件中并使用修改后的引导类路径运行JVM,通过命令行参数-Xbootclasspath
(java。*和其他一些软件包;我相信至少sun。*和javax。*也需要这个。)
这也可以用于AspectJ ...但我不确定。