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();