PreserveAllAnnotations option causes class file parser to preserve 
RuntimeInvisibleAnnotations so VM considers them as RuntimeVisibleAnnotations.
For class retransformation JvmtiClassFileReconstituter restores all annotations 
as RuntimeVisibleAnnotations attributes.
This can cause problem is the class contains only RuntimeInvisibleAnnotations, 
so corresponding RuntimeVisibleAnnotations attribute name is not present in the 
class constant pool.

Correct solution would be to store additional information about 
RuntimeInvisibleAnnotations and restore them exactly as they were in the 
original class (this should be done for all annotations: 
RuntimeInvisibleAnnotations/RuntimeInvisibleTypeAnnotations for class, fields 
and records, 
RuntimeInvisibleAnnotations/RuntimeInvisibleTypeAnnotations/RuntimeInvisibleParameterAnnotations
 for methods; need to ensure the information is correctly updated during class 
redefinition & retransformation).

I think it doesn't make sense to add all the complexity for almost no value (I 
doubt anyone uses PreserveAllAnnotations, the flag looks like experimental, we 
don't have any tests for it).

The suggested fix adds workaround for this corner case - if "visible" attribute 
name is not in the CP, the annotations are restored with "invisible" attribute 
name.

Testing:
  - tier1,tier2,hs-tier5-svc
  - all java/lang/instrument tests;
  - all RedefineClasses/RetransformClasses tests

-------------

Commit messages:
 - fix

Changes: https://git.openjdk.org/jdk/pull/18540/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=18540&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8328137
  Stats: 33 lines in 3 files changed: 22 ins; 0 del; 11 mod
  Patch: https://git.openjdk.org/jdk/pull/18540.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/18540/head:pull/18540

PR: https://git.openjdk.org/jdk/pull/18540

Reply via email to