【发布时间】:2014-09-22 06:26:40
【问题描述】:
我正在尝试通过 attach API 检测 java 类(我想专门检测 java.sql.DriverManager.getConnection() 方法并记录返回的 Connection 对象)。
所以,我正在执行存储和加载操作并调用在我的一个类中定义的方法(例如,foo.TestRecordingClass.myFooRecordingMethod())。
现在,我的问题是,每当我尝试调用前面提到的方法时(通过附加 API:agentmain 被调用),我都会得到一个NoClassDefFoundError。
但是,同样的东西可以完美地使用 premain ,也就是 Xbootclasspath 方法。
提前致谢:-)
编辑1:
好的,我可以使用instrumentation对象的appendToBootstrapClassLoaderSearch(JarFile)方法解决问题。
现在,我面临的另一个问题是将一个this 对象加载到堆栈上。
理论上,如果我做aload_0操作,那应该加载当前对象,然后我可以将它传递给任何方法,对吧?
在visitInsn 方法中(即从方法返回时),我正在这样做:
super.visitVarInsn(Opcodes.ALOAD, 0);
super.visitMethodInsn(Opcodes.INVOKESTATIC, fooClassName, "fooMethodReturnInstrumentor", "(Ljava/lang/Object;)V");
这应该加载对象本身,但我无法检索任何内容。
【问题讨论】:
标签: java bytecode instrumentation java-bytecode-asm