JDK 9 RFR of JDK-5040830: (ann) please improve toString() for annotations containing exception proxies

Joel Borggrén-Franck joel.borggren.franck at gmail.com
Wed Jun 1 18:33:18 UTC 2016


Hi Joe,

I noticed you chose the old format for a type mismatch ("class java
...") and print the type name in the middle of the comment instead of
before, why?

Other than that, looks good!

cheers
/Joel

On Tue, May 31, 2016 at 9:43 PM, joe darcy <joe.darcy at oracle.com> wrote:
> Hello,
>
> Some background, when everything is going well, the toString form of an
> annotation looks something like
>
> // Old non-erroneous annotation
>
> @DangerousAnnotation(utopia=BRIGADOON,
> thirtyTwoBitsAreNotEnough=42,
> classy=interface Fleeting,
> classies=[class java.lang.Object, int],
> moreClassies=[])
>
> with newlines added for clarity. However, there are various kinds of
> problems that can occur with the data in an annotation and in those cases an
> exception proxy is created so that if the corresponding method is called an
> exception is thrown rather than the data being returned. In these cases the
> string form of an annotation with
> exceptions-that-would-be-thrown-if-methods-are-called looks like:
>
> // Current erroneous annotation
>
> @DangerousAnnotation(utopia=sun.reflect.annotation.EnumConstantNotPresentExceptionProxy at 766a8c91,
> thirtyTwoBitsAreNotEnough=sun.reflect.annotation.AnnotationTypeMismatchExceptionProxy at 1f40866a,
> classy=sun.reflect.annotation.TypeNotPresentExceptionProxy at 3de4f72b,
> classies=[class java.lang.Object, int],
> moreClassies=[])
>
> Having the proxy implementation leak through to the string representation in
> this case is not helpful and the string can be made more informative. In
> addition, for Class-related values, the current form doesn't use the syntax
> which is legal in source code for annotations. Class-valued annotations are
> set using Class literal syntax, "Foo.class" rather than "class Foo", and
> arrays of Class-valued item should use braces ("{}") rather than brackets,
> ("[]").
>
> For example, it would be better to have annotation string representations
> which looked like:
>
> // New non-erroneous annotation
>
> @DangerousAnnotation(utopia=BRIGADOON,
> thirtyTwoBitsAreNotEnough=42,
> classy=Fleeting.class,
> classies={java.lang.Object.class, int.class},
> moreClassies={})
>
> // New erroneous annotation
>
> @DangerousAnnotation(utopia=BRIGADOON /* Warning: constant not present! */,
> thirtyTwoBitsAreNotEnough=/* Warning type mismatch! "class
> java.lang.Integer[42]" */,
> classy=Fleeting.class /* Warning: type not present! */,
> classies={java.lang.Object.class, int.class},
> moreClassies={})
>
> Please review the code to implement these behavioral changes:
>
>     5040830: (ann) please improve toString() for annotations containing
> exception proxies
>     http://cr.openjdk.java.net/~darcy/5040830.2
>
> (If you have erroneous Class-value items in an array of Class values, then
> this throws an exception since the exception proxy cannot be stored into the
> Class[].)
>
> Thanks,
>
> -Joe
>


More information about the core-libs-dev mailing list