8277672: Better invocation handler handling

Reviewed-by: mbaesken
Backport-of: 0691804665559f1935b7361d5f1207ac46f823f0
diff --git a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
index d2a8d43..2d6a2ea 100644
--- a/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
+++ b/src/java.base/share/classes/sun/reflect/annotation/AnnotationInvocationHandler.java
@@ -603,8 +603,8 @@
                 if (!(memberType.isInstance(value) ||
                       value instanceof ExceptionProxy)) {
                     value = new AnnotationTypeMismatchExceptionProxy(
-                            value.getClass() + "[" + value + "]").setMember(
-                                annotationType.members().get(name));
+                                objectToString(value))
+                        .setMember(annotationType.members().get(name));
                 }
             }
             mv.put(name, value);
@@ -614,6 +614,15 @@
         UnsafeAccessor.setMemberValues(this, mv);
     }
 
+    /*
+     * Create a textual representation of the argument without calling
+     * any overridable methods of the argument.
+     */
+    private static String objectToString(Object value) {
+        return value.getClass().getName() + "@" +
+            Integer.toHexString(System.identityHashCode(value));
+    }
+
     private static class UnsafeAccessor {
         private static final jdk.internal.misc.Unsafe unsafe
                 = jdk.internal.misc.Unsafe.getUnsafe();