首页 > 解决方案 > 有没有办法在 Java 语言(非本机)JVM 代理中启用“本机方法前缀”功能?

问题描述

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

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

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

标签: javajvminstrumentationjvmti

解决方案


Java 代理所需的功能由其 jar 文件的清单属性确定,如包文档底部所指定:

清单属性

为代理 JAR 文件定义了以下清单属性:

…</p>

  • Can-Set-Native-Method-Prefix
    Boolean(truefalse,大小写无关)。是否能够设置此代理所需的本机方法前缀。以外的值true被考虑false。该属性是可选的,默认为false.

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


推荐阅读