有没有办法在 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.
加载的代理请求该功能
背景: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
orfalse
, case irrelevant). Is the ability to set native method prefix needed by this agent. Values other thantrue
are consideredfalse
. This attribute is optional, the default isfalse
.
我没有专门尝试使用本地方法前缀,但我从其他功能(重新定义和重新转换)中知道它们仅在先前通过 Instrumentation
接口请求时被报告为支持显化属性。没有任何请求该功能的启动时代理甚至可能导致以后无法通过 Attach API.