Java 似乎retransformClasses删除了用户定义的属性(?)如何向通过重新传输保留的方法添加注释?

Java 似乎retransformClasses删除了用户定义的属性(?)如何向通过重新传输保留的方法添加注释?,java,jvm,instrumentation,Java,Jvm,Instrumentation,作为插装工具套件的一部分,我们有一个静态预过程,它修改类的某些方法,然后用用户定义的属性标记这些方法。当应用程序运行时,如果类文件直接呈现给transform()方法,即它是类的第一次加载,我可以看到这些属性。但是如果我使用retransformClasses(),那么当我在transform()方法中获得控制时,我的属性就被删除了。我可以理解为什么JVM在重新创建要传递给transform()的类字节时可能会丢弃未知属性,但我找不到任何验证和/或描述此行为的文档 我怎样才能实现这个目标?我无法

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

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

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


感谢您的建议。

一旦加载了类文件,HotSpot JVM就不会保留原始字节码。相反,它会在需要时从内部VM表示中删除字节码。VM不理解的属性不会被还原

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

初始类文件字节表示传递给的字节 ClassLoader.defineClass或重定义类(在任何转换之前 但它们可能并不完全匹配。常数 池可能没有相同的布局或内容。恒定池可能 有更多或更少的条目。常量池条目可能位于 不同的顺序;但是,字节码中的常量池索引 方法将相应。某些属性可能不存在。哪里 顺序没有意义,例如方法的顺序,顺序可能 不能保存

同时,JVM可以理解
RuntimeVisibleAnnotations
属性。此外,还有JavaAPI来访问它们,因此JVM不能在转换过程中丢弃它们。重构字节码时,热点JVM确实
RuntimeVisibleAnnotations

因此,最好的选择是使用注释——毕竟,注释的设计完全是为了用用户定义的元数据标记成员