在 Java 代理检测中替换/交换 Java 类 [已关闭]

问题描述 投票:0回答:1

我读过这篇post,它以“逐行”的方式进行字节码检测。它很笨拙并且容易出错。我想知道 Javassit 是否支持用检测类“替换”或“交换”类。我看到 redefineClasses 方法,但我不确定它是否用于此目的,而且我找不到任何相关示例。

如果 SO 中的任何人能给我一个在

redefineClasses
 中使用 
Javassist

的示例,我将不胜感激

我的目标是使用 Java 检测在多个 Java 类和方法中提取一些有意义的数据,而不仅仅是在这些示例中打印开始/结束时间。这就是为什么我认为“交换 Java 类”方法在开发过程中更有效。

你们有什么想法和建议?

java bytecode instrumentation agent javaagents
1个回答
1
投票

因为您是 Java 仪器的新手,所以我想详细说明 Johannes 的正确评论:我建议您不仅阅读 Baeldung 文章,还阅读一些相关的 javadocs。

例如,

Instrumentation.redefineClasses
的Java 8 API文档明确说明了重新定义类时的限制:

重定义可能会改变方法体、常量池和属性。重新定义不得添加、删除或重命名字段或方法,更改方法的签名或更改继承。这些限制可能会在未来版本中取消。

唉,从 Java 17 开始,限制还没有取消。同样的方法描述如下:

JVM TI RedefineClasses中描述了支持的类文件更改。

所指向的文档基本上与 Java 8 文档相同,只是更详细一些:

重定义可能会改变方法体、常量池和属性(除非明确禁止)。重新定义不得添加、删除或重命名字段或方法,更改方法的签名,更改修饰符或更改继承。重新定义不得更改

NestHost
NestMembers
Record
PermittedSubclasses
属性。这些限制可能会在未来版本中取消。

此外,同样的限制也适用于

Instrumentation.retransformClasses
,区别基本上在于您不是从头开始,而是使用现有的类字节作为输入,并且可以链接多个转换器以增量地检测现有类。但即使重新定义,基线仍保留原始类(如果之前已加载)。

© www.soinside.com 2019 - 2024. All rights reserved.