java - 有没有办法在 Java 语言(非本机)JVM 代理中启用“本机方法前缀”功能?
问题描述
背景:java 有一种检测本机方法的机制,基本上允许您使用设置的前缀重命名本机方法,然后以字节码创建一个委托给它的方法。
默认情况下,这是不允许的。调用Instrumentation.setNativePrefix()
对 执行检查InstrumentationImpl.mEnvironmentSupportsNativeMethodPrefix
,我在 jvm C 代码中看到的默认为“false”。
我看到可能有一种方法可以通过 JVMTI 使用本机代理启用它,但我找不到任何关于使用 java 语言代理启用它的信息。
解决方案
Java 代理所需的功能由其 jar 文件的清单属性确定,如包文档底部所指定:
清单属性
为代理 JAR 文件定义了以下清单属性:
…</p>
- Can-Set-Native-Method-Prefix
Boolean(true
或false
,大小写无关)。是否能够设置此代理所需的本机方法前缀。以外的值true
被考虑false
。该属性是可选的,默认为false
.
我没有专门尝试使用本机方法前缀,但我从其他功能(重新定义和重新转换)中知道,它们仅Instrumentation
在先前通过清单属性请求时才报告为受接口支持。如果没有任何启动时代理请求该功能,甚至可能导致稍后通过 Attach API 加载的代理无法请求该功能。
推荐阅读
- java - 在android模拟器中访问google api时出现运行时错误
- selenium - 如何填写具有“用户名”和“密码”两个字段的弹出表单?
- excel - 如何删除分配给 VBA/Excel 中特定名称的重复值?
- flutter - 错误“在 null 上调用了 getter 'url'。” 我在这里做错了什么?
- amazon-web-services - 使用 AWS_IAM 的 AWS API 网关方法身份验证
- azure-data-factory - Azure 数据工厂性能问题 - 直到活动循环存在消耗大量时间
- activemq-artemis - ActiveMQ Artemis 如何控制多播队列名称?
- java - Cordova 选择了错误的 java 版本
- php - 使用 tinymce 创建的表提供了太多隐藏的换行元素
- node.js - 将 Firestore 数据多次导出到同一个存储文件夹是否安全?覆盖会破坏导出的数据吗?