It appears the plain overloads of Arrays.toString cannot be used to provide an annotation source compatible form since they use "[]" rather than "{}" to surround to contents. I'll see if I can handle that.

On 7/28/2016 8:33 AM, Rafael Winterhalter wrote:
Another remark about "printability". Array types are printed in their internal form, i.e. "java.lang.Void[].class" becomes "Ljava.lang.Void;.class" in the string form.

Ah yes, good catch -- some more checking is required there.


While I very much agree over the improvements of the toString implementation of the unresolved values, I still wonder if this special treatment is really necessary and justify the compatibility break. Are the curly braces meant to avoid confusion from parsing annotation values where the braces could also be part of a type literal? Any parser would need to process the annotation string sensitively anyways as string values could contain any value, if this is the case.

As a general comment, the exact toString output of an annotation is deliberately not specified; from java.lang.annotation.Annotation.toString():

     * Returns a string representation of this annotation.  The details
     * of the representation are implementation-dependent [...]

Therefore, the details of the toString output of annotations are not a formally exported interface of the platform. (For more details discussions of such matters see [1].)

Early in the life of the platform, there was a preference to exactly specify toString output and hash values, etc., but this policy was found to be overly constraining so we moved away from that.

HTH,

-Joe

[1] http://cr.openjdk.java.net/~darcy/OpenJdkDevGuide/OpenJdkDevelopersGuide.v0.777.html


Best regards, Rafael

2016-07-28 15:38 GMT+02:00 Rafael Winterhalter <rafael....@gmail.com <mailto:rafael....@gmail.com>>:

    Hi Joe,
    thank you for your answer. Can I ask for the rationale of using {}
    instead of [] only for classes? If the goal was to come closer to
    the source code representation, would this not imply to use curly
    braces for all array of an annotation?
    Thank you for your time! Best regards, Rafael

    2016-07-19 4:13 GMT+02:00 joe darcy <joe.da...@oracle.com
    <mailto:joe.da...@oracle.com>>:

        Hello Rafael,

        On 7/18/2016 5:43 PM, Rafael Winterhalter wrote:

            Hello,
            I recognized a failing test on Java 9 caused by a changed
            return value
            returned by toString on an annotation with a class-property.

            When calling toString on an annotation: @interface Foo {
            Class<?> value();
            } instantiated as @Foo(Bar.class) with Java 8 it would be
            printed as:

            @Foo(class Bar)

            while in Java 9 it is printed as:

            @Foo(Bar.class)

            Is this change intended? I do not see a big benefit of
            this implementation
            change and it could break code. In my case, the problem is
            not that big, it
            is an easy fix but still, I found it a bit surprising.


        I pushed the change your test noticed; it was done as part of

            JDK-5040830: (ann) please improve toString() for
        annotations containing exception proxies
        https://bugs.openjdk.java.net/browse/JDK-5040830

        The basic rationale for the change is that "Foo.class" is the
        syntax that appears when annotations are in source code so the
        toString() form should generally reflect that.

        Thanks for running your project against JDK 9 builds; HTH,

        -Joe




Reply via email to