【发布时间】:2013-12-09 22:12:06
【问题描述】:
我正在使用 asm 对 java 函数进行字节码检测。 有没有办法对 jre 本机函数做同样的事情?也许是一种用 java 函数包装本机函数的方法?
最后我的目的是获取所有使用参数运行的函数的列表。
【问题讨论】:
标签: java instrumentation
我正在使用 asm 对 java 函数进行字节码检测。 有没有办法对 jre 本机函数做同样的事情?也许是一种用 java 函数包装本机函数的方法?
最后我的目的是获取所有使用参数运行的函数的列表。
【问题讨论】:
标签: java instrumentation
由于native 方法是在类文件中声明的,您可以像任何其他方法一样替换它们。棘手的部分是如何调用原始方法。为此,您可以创建另一个 native 方法,该方法将链接到原始 native 代码。
这必须在加载时发生,因为大多数 JVM 不支持之后添加方法。有一个功能可以帮助您将新的辅助方法链接到原始代码,本机方法前缀。 documentation of Instrumentation.setNativeMethodPrefix 解释详情。
【讨论】:
native 方法只是内在函数,即 JVM 知道这些方法,并在遇到时用内部操作替换它们的调用。因此,对于此类方法,检测方法本身不起作用,但您可以使用转换器将 invocations 替换为其他代码,而不是修改方法。
Unsafe.allocateMemory() 不是内在函数。