- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
作为我们的检测工具套件的一部分,我们有一个静态预传递,它可以修改类的某些方法,然后使用用户定义的属性标记这些方法。当应用程序运行时,如果类文件直接呈现给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/
我是一名优秀的程序员,十分优秀!