首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新转换Java Instrumentation Agent库中的本机方法

重新转换Java Instrumentation Agent库中的本机方法
EN

Stack Overflow用户
提问于 2012-12-19 22:11:48
回答 1查看 1.2K关注 0票数 2

我正在尝试编写一个Java代理库,它通过attach api动态加载,以重新转换某些方法(出现在某些线程的堆栈跟踪中),以记录方法的进入/退出。然后,通过自定义MBean导出方法进入/退出信息。

到目前为止,我目前的“原型”是有效的,只要插入指令的方法不是本机的。

根据java.lang.instrument.Instrumentation#setNativeMethodPrefix()的文档,java代理应该可以用非本机存根方法替换本机方法,并在其名称中添加另一个具有该前缀的本机方法,然后将该方法绑定到原始本机方法的本机代码。

然而,在实现它的时候,我得到了这个错误:

代码语言:javascript
复制
java.lang.UnsupportedOperationException: class redefinition failed: attempted to add a method

只有用非本机方法替换本机方法才能工作,但这样我就不能将回调委托给原始的本机方法。在另一个类中定义本机方法也不起作用,因为本机方法是按类名和方法名查找的,并且没有nativeMethodClassSuffix或类似的东西。在另一个新的类加载器中定义另一个同名的类是可行的,我认为可以通过一些间接的方式将调用委托给新的类,但是一个本机库只能链接到由一个类加载器的类加载的本机方法,所以我不会正确地链接这些本机方法。

有什么明显的我遗漏了什么吗?我的代码太长了,不能在这里发布,如果有人认为它有帮助,我可以尝试构建一个小的示例java代理,它显示了问题并链接到这里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-19 22:27:22

有没有什么明显的我遗漏了什么?我的代码太长了,不能在这里发布,如果有人认为它有帮助,我可以尝试构建一个小的示例java代理,它显示了问题并链接到这里。

不是的。如果您屏蔽了本机方法,则不再有任何方法可以从JNI调用它。您需要使用本机代码调用该方法。(我不知道这是什么,但如果不可能,我会感到惊讶)

另一种选择是更改对本机方法的所有引用,而不是屏蔽它。这样,当您选择调用原始方法时,仍然可以这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13954192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档