我读过这篇post,它以“逐行”的方式进行字节码检测。它很笨拙并且容易出错。我想知道 Javassit 是否支持用检测类“替换”或“交换”类。我看到 redefineClasses 方法,但我不确定它是否用于此目的,而且我找不到任何相关示例。
如果 SO 中的任何人能给我一个在
redefineClasses
中使用
Javassist
的示例,我将不胜感激
我的目标是使用 Java 检测在多个 Java 类和方法中提取一些有意义的数据,而不仅仅是在这些示例中打印开始/结束时间。这就是为什么我认为“交换 Java 类”方法在开发过程中更有效。
你们有什么想法和建议?
因为您是 Java 仪器的新手,所以我想详细说明 Johannes 的正确评论:我建议您不仅阅读 Baeldung 文章,还阅读一些相关的 javadocs。
Instrumentation.redefineClasses
的Java 8 API文档明确说明了重新定义类时的限制:
重定义可能会改变方法体、常量池和属性。重新定义不得添加、删除或重命名字段或方法,更改方法的签名或更改继承。这些限制可能会在未来版本中取消。
唉,从 Java 17 开始,限制还没有取消。同样的方法描述如下:
JVM TI RedefineClasses中描述了支持的类文件更改。
所指向的文档基本上与 Java 8 文档相同,只是更详细一些:
重定义可能会改变方法体、常量池和属性(除非明确禁止)。重新定义不得添加、删除或重命名字段或方法,更改方法的签名,更改修饰符或更改继承。重新定义不得更改
、NestHost
、NestMembers
或Record
属性。这些限制可能会在未来版本中取消。PermittedSubclasses
Instrumentation.retransformClasses
,区别基本上在于您不是从头开始,而是使用现有的类字节作为输入,并且可以链接多个转换器以增量地检测现有类。但即使重新定义,基线仍保留原始类(如果之前已加载)。