diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java index b97d82b9b1..a48481ca54 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AbstractAliasAwareAnnotationAttributeExtractor.java @@ -31,17 +31,18 @@ import org.springframework.util.ObjectUtils; * * @author Sam Brannen * @since 4.2 + * @param the type of source supported by this extractor * @see Annotation * @see AliasFor * @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement) */ -abstract class AbstractAliasAwareAnnotationAttributeExtractor implements AnnotationAttributeExtractor { +abstract class AbstractAliasAwareAnnotationAttributeExtractor implements AnnotationAttributeExtractor { private final Class annotationType; private final AnnotatedElement annotatedElement; - private final Object source; + private final S source; private final Map attributeAliasMap; @@ -54,7 +55,7 @@ abstract class AbstractAliasAwareAnnotationAttributeExtractor implements Annotat * @param source the underlying source of annotation attributes; never {@code null} */ AbstractAliasAwareAnnotationAttributeExtractor(Class annotationType, - AnnotatedElement annotatedElement, Object source) { + AnnotatedElement annotatedElement, S source) { Assert.notNull(annotationType, "annotationType must not be null"); Assert.notNull(source, "source must not be null"); @@ -76,7 +77,7 @@ abstract class AbstractAliasAwareAnnotationAttributeExtractor implements Annotat } @Override - public Object getSource() { + public final S getSource() { return this.source; } diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java index ecb1e1c269..86ca194bce 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationAttributeExtractor.java @@ -28,9 +28,10 @@ import java.lang.reflect.Method; * * @author Sam Brannen * @since 4.2 + * @param the type of source supported by this extractor * @see SynthesizedAnnotationInvocationHandler */ -interface AnnotationAttributeExtractor { +interface AnnotationAttributeExtractor { /** * Get the type of annotation that this extractor extracts attribute @@ -48,7 +49,7 @@ interface AnnotationAttributeExtractor { /** * Get the underlying source of annotation attributes. */ - Object getSource(); + S getSource(); /** * Get the attribute value from the underlying {@linkplain #getSource source} diff --git a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java index 7bd171a17d..6ab73081ba 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/AnnotationUtils.java @@ -1225,7 +1225,7 @@ public abstract class AnnotationUtils { return annotation; } - AnnotationAttributeExtractor attributeExtractor = + DefaultAnnotationAttributeExtractor attributeExtractor = new DefaultAnnotationAttributeExtractor(annotation, annotatedElement); InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor); A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(), @@ -1273,7 +1273,7 @@ public abstract class AnnotationUtils { return null; } - AnnotationAttributeExtractor attributeExtractor = + MapAnnotationAttributeExtractor attributeExtractor = new MapAnnotationAttributeExtractor(attributes, annotationType, annotatedElement); InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor); A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(), diff --git a/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java index 827e63b4c1..805c769b78 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/DefaultAnnotationAttributeExtractor.java @@ -34,7 +34,7 @@ import org.springframework.util.ReflectionUtils; * @see MapAnnotationAttributeExtractor * @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement) */ -class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor { +class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor { /** * Construct a new {@code DefaultAnnotationAttributeExtractor}. @@ -47,11 +47,6 @@ class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAt } - @Override - public Annotation getSource() { - return (Annotation) super.getSource(); - } - @Override protected Object getRawAttributeValue(Method attributeMethod) { ReflectionUtils.makeAccessible(attributeMethod); @@ -60,7 +55,7 @@ class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAt @Override protected Object getRawAttributeValue(String attributeName) { - Method attributeMethod = ReflectionUtils.findMethod(getSource().annotationType(), attributeName); + Method attributeMethod = ReflectionUtils.findMethod(getAnnotationType(), attributeName); return getRawAttributeValue(attributeMethod); } diff --git a/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java b/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java index e8a2d9adc5..0f5591c16b 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/MapAnnotationAttributeExtractor.java @@ -38,7 +38,7 @@ import static org.springframework.core.annotation.AnnotationUtils.*; * @see DefaultAnnotationAttributeExtractor * @see AnnotationUtils#synthesizeAnnotation(Map, Class, AnnotatedElement) */ -class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor { +class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor> { /** * Construct a new {@code MapAnnotationAttributeExtractor}. @@ -57,14 +57,9 @@ class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttrib } - @SuppressWarnings("unchecked") - public Map getSource() { - return (Map) super.getSource(); - } - @Override protected Object getRawAttributeValue(Method attributeMethod) { - return getSource().get(attributeMethod.getName()); + return getRawAttributeValue(attributeMethod.getName()); } @Override diff --git a/spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java b/spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java index c3ae43c58e..b933823f54 100644 --- a/spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java +++ b/spring-core/src/main/java/org/springframework/core/annotation/SynthesizedAnnotationInvocationHandler.java @@ -45,7 +45,7 @@ import static org.springframework.util.ReflectionUtils.*; */ class SynthesizedAnnotationInvocationHandler implements InvocationHandler { - private final AnnotationAttributeExtractor attributeExtractor; + private final AnnotationAttributeExtractor attributeExtractor; private final Map valueCache = new ConcurrentHashMap(8); @@ -55,7 +55,7 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler { * the supplied {@link AnnotationAttributeExtractor}. * @param attributeExtractor the extractor to delegate to */ - SynthesizedAnnotationInvocationHandler(AnnotationAttributeExtractor attributeExtractor) { + SynthesizedAnnotationInvocationHandler(AnnotationAttributeExtractor attributeExtractor) { Assert.notNull(attributeExtractor, "AnnotationAttributeExtractor must not be null"); this.attributeExtractor = attributeExtractor; }