diff --git a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java index eb74d51b780..6b1a9f0e6c3 100644 --- a/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java +++ b/spring-core/src/main/java/org/springframework/core/convert/TypeDescriptor.java @@ -479,7 +479,7 @@ public class TypeDescriptor implements Serializable { } if (anns.length > 0) { for (int i = 0; i < anns.length; i++) { - if (anns[i] != otherAnns[i]) { + if (!annotationEquals(anns[i], otherAnns[i])) { return false; } } @@ -487,6 +487,11 @@ public class TypeDescriptor implements Serializable { return true; } + private boolean annotationEquals(Annotation ann, Annotation otherAnn) { + // Annotation.equals is reflective and pretty slow, so let's check identity and proxy type first. + return (ann == otherAnn || (ann.getClass() == otherAnn.getClass() && ann.equals(otherAnn))); + } + @Override public int hashCode() { return getType().hashCode();