有没有办法在 java 语言(非本地)JVM 代理中启用 "native method prefix" 功能?

Is there a way to enable "native method prefix" capabilities in a java language (non-native) JVM agent?

背景:java 有一种检测本机方法的机制,基本上允许您使用设置的前缀重命名本机方法,然后在字节码中创建一个委托给它的方法。

默认情况下这是不允许的。调用 Instrumentation.setNativePrefix()InstrumentationImpl.mEnvironmentSupportsNativeMethodPrefix 执行检查,我在 jvm C 代码中看到它默认为 "false".

我看到可能有一种方法可以通过 JVMTI 使用本机代理启用它,但我找不到任何关于使用 java 语言代理启用它的信息。

Java 代理所需的功能由其 jar 文件的清单属性决定,如 the bottom of the package documentation:

中指定

Manifest Attributes

The following manifest attributes are defined for an agent JAR file:

  • Can-Set-Native-Method-Prefix
    Boolean (true or false, case irrelevant). Is the ability to set native method prefix needed by this agent. Values other than true are considered false. This attribute is optional, the default is false.

我没有专门尝试使用本地方法前缀,但我从其他功能(重新定义和重新转换)中知道它们仅在先前通过 Instrumentation 接口请求时被报告为支持显化属性。没有任何请求该功能的启动时代理甚至可能导致以后无法通过 Attach API.

加载的代理请求该功能