RFR: JDK-8267936: PreserveAllAnnotations option isn't tested

Peter Levart plevart at openjdk.java.net
Tue Jun 29 08:04:06 UTC 2021


On Tue, 1 Jun 2021 09:30:40 GMT, Jaroslav Tulach <github.com+26887752+JaroslavTulach at openjdk.org> wrote:

> There doesn't seem to be much support for the complete changes in #4245. To get at least something useful from that endeavor I have extracted the test for existing behavior of `-XX:+PreserveAllAnnotations` and I am offering it in this pull request without any changes to the JVM behavior.

To share the information... I contacted one of the original authors of Java annotations, but he doesn't remember anything about the option. Here's the conversation...

On Thu, Jun 3, 2021 at 11:53 PM Peter Levart <peter.levart at gmail.com> wrote:
>
>             There is an undocumented JVM flag called "-XX+PreserveAllAnnotations"
>             which according to JVM code affects the way
>             "RuntimeInvisibleAnnotations" kind of class attributes are treated at
>             runtime. Normally they are ignored (since they normally contain only
>             metadata for annotation types with CLASS retention), but when this flag
>             is passed to JVM, such attributes are also passed to AnnotationParser
>             together with "RuntimeVisibleAnnotations" kind of class attributes.
>
>             So the question is: "What was the original intent of this JVM flag". A
>             debate sprung in a review thread on JDK GitHub and some say that this is
>             probably just a "leftover from an early implementation" and are
>             proposing to deprecate and remove it. Others (me mostly) see some sense
>             in the feature as it allows migrating an annotation type from CLASS
>             retention to RUNTIME without recompiling all the classes that use the
>             annotation. Do you happen to know the original intent of this JVM flag?

On Fri, Jun 4, 2021 at 6:54 AM Neal Gafter <neal at gafter.com> wrote:
>
>         I don’t recall that flag, but my suspicion is that it was used to assist testing.
>         If you ask me, I think the ecosystem would be better without it.

On 04/06/2021 15:56, Neal Gafter wrote:
>
>       One more thing.  You don’t have to recompile uses of an annotation to migrate 
>       from class to runtime retention.  You only have to recompile the attribute declaration.

On Fri, Jun 4, 2021 at 7:15 AM Peter Levart <peter.levart at gmail.com> wrote:
>
>     Not really. The AnnotationParser does filter out annotations based on current "retention" 
>     of annotation type which is just a meta-annotation on the annotation type, so it would appear 
>     that only the annotation declaration has to be recompiled, but as I described, the annotation 
>     uses in classes that use the annotation get compiled into two kinds of class attributes: 
>     RuntimeVisibleAnnotations (those with RUNTIME retention) and RuntimeInvisibleAnnotations 
>     (those with CLASS retention). Only those from RuntimeVisibleAnnotations are passed to 
>     AnnotationParser at runtime unless this VM flag is given which makes the VM pass a concatenation 
>     of RuntimeVisibleAnnotations and RuntimeInvisibleAnnotations to the AnnotationParser.
>     So merely changing the annotation retention and recompiling the annotation declaration is not enough. 
>     You have to also either recompile annotation uses or pass this VM flag. 
>     So I was wondering if the flag was actually meant for this purpose.

On 04/06/2021 17:30, Neal Gafter wrote:
>
>     Got it. I don't remember anything about the VM flag, but I doubt it was designed to be used for this purpose.

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

PR: https://git.openjdk.java.net/jdk/pull/4280


More information about the core-libs-dev mailing list