背景:java通过基本允许您使用设置的前缀重命名本机方法,然后创建一个以字节码委托给它的方法的方式,对本机方法进行检测。
默认情况下,这是不允许的。调用Instrumentation.setNativePrefix()
对InstrumentationImpl.mEnvironmentSupportsNativeMethodPrefix
进行检查,我在jvm C代码中看到默认情况下为“ false”。
我看到可能有一种方法可以通过JVMTI与本机代理一起启用它,但是我找不到与使用Java语言代理启用它有关的任何东西。
答案 0 :(得分:1)
Java代理所需的功能由其jar文件的清单属性决定,如the bottom of the package documentation所示:
清单属性
以下清单属性是为代理JAR文件定义的:
...
- 可以设置本机方法前缀
布尔值(true
或false
,不区分大小写)。能够设置此代理所需的本机方法前缀。除true
以外的其他值均视为false
。此属性是可选的,默认值为false
。
我没有专门使用本机方法前缀进行尝试,但是从其他功能(重新定义和重新转换)中我知道,以前通过清单属性请求时,它们仅被报告为Instrumentation
接口支持。没有任何启动时代理程序请求该功能,甚至可能使稍后通过附加API加载的代理程序无法请求该功能。