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

时间:2018-09-20 14:35:26

标签: java jvm instrumentation jvmti

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

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

我看到可能有一种方法可以通过JVMTI与本机代理一起启用它,但是我找不到与使用Java语言代理启用它有关的任何东西。

1 个答案:

答案 0 :(得分:1)

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

  

清单属性

     

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

     

...

     
      
  • 可以设置本机方法前缀
      布尔值(truefalse,不区分大小写)。能够设置此代理所需的本机方法前缀。除true以外的其他值均视为false。此属性是可选的,默认值为false
  •   

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