Java仪器代理库中的重新变义本机方法

 2023-01-21    277  

问题描述

我正在尝试编写一个通过附加API动态加载的Java代理库,以重新传输一些方法(在某些线程的堆栈痕迹中出现的方法)以记录方法输入/退出.然后,方法输入/退出信息将通过自定义MBean导出.

我当前的”原型”起作用,只要仪器的方法不是本地的.

Java仪器代理库中的重新变义本机方法

According to the documentation of java.lang.instrument.instrumentation#setnativemethodprefix(),Java代理应该有可能用非本机方法代替非本机方法方法并在其名称中添加其他前缀,然后将其绑定到原始本机方法的原始方法.

但是,在实现此问题时,我会收到此错误:

java.lang.UnsupportedOperationException: class redefinition failed: attempted to add a method

这是正确的,因为我添加了新的本机方法.

仅用非本地方法代替本机方法,但是我无法将调用委派给原始本机方法.在另一类中定义本机方法或工作,因为本机方法是通过类名称和方法名称查找的,并且没有nativeMethodClassSuffix或类似.在另一个新类负载程序中定义另一个类同名的类,我认为有可能通过某些间接来委派将呼叫委派给新类,但是一个本机库只能链接到仅由一个类的类别加载的本机方法班级加载程序,所以我不会正确链接本机方法.

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

推荐答案

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

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

另一个选项是将所有引用对本机方法更改,而不是将其掩盖.这样,当您选择时,您仍然可以调用原始方法.

以上所述是小编给大家介绍的Java仪器代理库中的重新变义本机方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26289.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。