--- old/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java 2016-05-31 12:38:49.829219144 -0700 +++ new/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java 2016-05-31 12:38:49.653219145 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,7 @@ import java.lang.reflect.*; import java.io.Serializable; import java.util.*; +import java.util.stream.Collectors; import java.security.AccessController; import java.security.PrivilegedAction; @@ -158,13 +159,17 @@ } /** - * Translates a member value (in "dynamic proxy return form") into a string + * Translates a member value (in "dynamic proxy return form") into a string. */ private static String memberValueToString(Object value) { Class type = value.getClass(); - if (!type.isArray()) // primitive, string, class, enum const, - // or annotation - return value.toString(); + if (!type.isArray()) { // primitive, string, class, enum const, + // or annotation + if (type == Class.class) + return classValueToString((Class) value); + else + return value.toString(); + } if (type == byte[].class) return Arrays.toString((byte[]) value); @@ -182,10 +187,26 @@ return Arrays.toString((short[]) value); if (type == boolean[].class) return Arrays.toString((boolean[]) value); + if (type == Class[].class) + return classArrayValueToString((Class[])value); return Arrays.toString((Object[]) value); } /** + * Translates a Class value to a form suitable for use in the + * string representation of an annotation. + */ + private static String classValueToString(Class clazz) { + return clazz.getName() + ".class" ; + } + + private static String classArrayValueToString(Class[] classes) { + return Arrays.stream(classes) + .map(AnnotationInvocationHandler::classValueToString) + .collect(Collectors.joining(", ", "{", "}")); + } + + /** * Implementation of dynamicProxy.equals(Object o) */ private Boolean equalsImpl(Object o) { --- old/src/java.base/share/classes/sun/reflect/annotation/AnnotationTypeMismatchExceptionProxy.java 2016-05-31 12:38:50.281219139 -0700 +++ new/src/java.base/share/classes/sun/reflect/annotation/AnnotationTypeMismatchExceptionProxy.java 2016-05-31 12:38:50.065219141 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -56,4 +56,9 @@ protected RuntimeException generateException() { return new AnnotationTypeMismatchException(member, foundType); } + + @Override + public String toString() { + return "/* Warning type mismatch! \"" + foundType + "\" */" ; + } } --- old/src/java.base/share/classes/sun/reflect/annotation/EnumConstantNotPresentExceptionProxy.java 2016-05-31 12:38:50.741219134 -0700 +++ new/src/java.base/share/classes/sun/reflect/annotation/EnumConstantNotPresentExceptionProxy.java 2016-05-31 12:38:50.561219136 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,4 +45,9 @@ protected RuntimeException generateException() { return new EnumConstantNotPresentException(enumType, constName); } + + @Override + public String toString() { + return constName + " /* Warning: constant not present! */"; + } } --- old/src/java.base/share/classes/sun/reflect/annotation/TypeNotPresentExceptionProxy.java 2016-05-31 12:38:51.161219130 -0700 +++ new/src/java.base/share/classes/sun/reflect/annotation/TypeNotPresentExceptionProxy.java 2016-05-31 12:38:50.977219132 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,4 +45,9 @@ protected RuntimeException generateException() { return new TypeNotPresentException(typeName, cause); } + + @Override + public String toString() { + return typeName + ".class /* Warning: type not present! */"; + } } --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/AnnotationHost.java 2016-05-31 12:38:51.369219128 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +@DangerousAnnotation(utopia=Utopia.BRIGADOON, + thirtyTwoBitsAreNotEnough=42, + classy=Fleeting.class, + classies={Object.class, int.class}, + moreClassies={}) +public class AnnotationHost {} \ No newline at end of file --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/ExceptionalToStringTest.java 2016-05-31 12:38:51.789219124 -0700 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 5040830 + * @summary Verify information annotation strings with exception proxies + * @compile -source 8 version1/Utopia.java version1/DangerousAnnotation.java version1/Fleeting.java + * @compile AnnotationHost.java + * @build ExceptionalToStringTest + * @run main ExceptionalToStringTest + * @clean Utopia DangerousAnnotation + * @compile -source 8 -implicit:none version2/Utopia.java + * @compile -source 8 -implicit:none version2/DangerousAnnotation.java + * @clean Fleeting + * @run main ExceptionalToStringTest + */ + +/** + * There are three potential exception conditions which can occur + * reading annotations: + * + * EnumConstantNotPresentException - "Thrown when an application tries + * to access an enum constant by name and the enum type contains no + * constant with the specified name." + * + * AnnotationTypeMismatchException - "Thrown to indicate that a + * program has attempted to access an element of an annotation whose + * type has changed after the annotation was compiled (or serialized)" + * + * TypeNotPresentException - "Thrown when an application tries to + * access a type using a string representing the type's name, but no + * definition for the type with the specified name can be found." + * + * The test reads an annotation, DangerousAnnotation, which can + * display all three pathologies. The pathologies are not + * present when the version1 sources are used but are present with the + * version2 sources. The version2 sources remove an enum constant + * (EnumConstantNotPresentException), change the return type of an + * annotation method (AnnotationTypeMismatchException), and remove a + * type whose Class literal is referenced (TypeNotPresentException). + */ +public class ExceptionalToStringTest { + public static void main(String... args) { + String annotationAsString = AnnotationHost.class.getAnnotation(DangerousAnnotation.class).toString(); + + // Verify no occurrence of "ExceptionProxy" in the string. + if (annotationAsString.indexOf("ExceptionProxy") != -1) { + throw new RuntimeException(); + } + } +} \ No newline at end of file --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/version1/DangerousAnnotation.java 2016-05-31 12:38:52.213219119 -0700 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface DangerousAnnotation { + Utopia utopia(); + int thirtyTwoBitsAreNotEnough(); + Class classy(); + Class[] classies(); + Class[] moreClassies(); +} --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/version1/Fleeting.java 2016-05-31 12:38:52.601219115 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Fleeting { + int value(); +} \ No newline at end of file --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/version1/Utopia.java 2016-05-31 12:38:52.993219111 -0700 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +public enum Utopia { + SHANGRI_LA, + BRIGADOON; // Only there one day out of every 100 years. +} --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/version2/DangerousAnnotation.java 2016-05-31 12:38:53.373219108 -0700 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.annotation.*; + +@Retention(RetentionPolicy.RUNTIME) +public @interface DangerousAnnotation { + Utopia utopia(); + long thirtyTwoBitsAreNotEnough(); + Class classy(); + Class[] classies(); + Class[] moreClassies(); +} --- /dev/null 2016-05-31 11:35:39.511724830 -0700 +++ new/test/java/lang/annotation/ExceptionalToString/version2/Utopia.java 2016-05-31 12:38:53.737219104 -0700 @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +public enum Utopia { + SHANGRI_LA; + //BRIGADOON -- Only there one day out of every 100 years. +}