gpt4 book ai didi

java - 看来 retransformClasses 删除了用户定义的属性(?)如何向通过重新转换保留的方法添加注释?

转载 作者:行者123 更新时间:2023-11-30 05:24:42 49 4
gpt4 key购买 nike

作为我们的检测工具套件的一部分,我们有一个静态预传递,它可以修改类的某些方法,然后使用用户定义的属性标记这些方法。当应用程序运行时,如果类文件直接呈现给transform()方法,即它是类的第一次加载,我可以看到这些属性。但是,如果我使用 retransformClasses(),那么当我在 transform() 方法中获得控制权时,我的属性已被删除。我可以理解为什么 JVM 在重新创建要传递给 Transform() 的类字节时可能会丢弃未知属性,但我找不到任何验证和/或描述此行为的文档。

我怎样才能实现这个目标?我无法保证 RuntimeVisible 注释不会发生同样的情况。即使它们被保留,它们也比我想避免这种方法的属性更难使用。

关于如何向通过 retransformClasses() 保留的方法添加“注释”,有什么想法吗?

感谢您的任何建议。

最佳答案

一旦加载了类文件,HotSpot JVM 就不会保留原始字节码。相反,它 reconstitutes需要时来自内部 VM 表示的字节码。 VM不理解的属性不会被恢复。

documentation retransformClasses 明确提到了这种可能性:

The initial class file bytes represent the bytes passed to ClassLoader.defineClass or redefineClasses (before any transformations were applied), however they might not exactly match them. The constant pool might not have the same layout or contents. The constant pool may have more or fewer entries. Constant pool entries may be in a different order; however, constant pool indices in the bytecodes of methods will correspond. Some attributes may not be present. Where order is not meaningful, for example the order of methods, order might not be preserved.

同时,JVM 可以理解 RuntimeVisibleAnnotations 属性。而且,有Java API来访问它们,因此JVM在转换过程中不能丢弃它们。确实是 HotSpot JVM writes重构字节码时的RuntimeVisibleAnnotations

因此,最好的选择是使用注释 - 毕竟,它们是专门为使用用户定义的元数据标记成员而设计的。

关于java - 看来 retransformClasses 删除了用户定义的属性(?)如何向通过重新转换保留的方法添加注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58896475/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com