Polish SynthesizedAnnotation support classes
This commit is contained in:
parent
f17173f6d5
commit
5deeaf348a
|
@ -31,17 +31,18 @@ import org.springframework.util.ObjectUtils;
|
||||||
*
|
*
|
||||||
* @author Sam Brannen
|
* @author Sam Brannen
|
||||||
* @since 4.2
|
* @since 4.2
|
||||||
|
* @param <S> the type of source supported by this extractor
|
||||||
* @see Annotation
|
* @see Annotation
|
||||||
* @see AliasFor
|
* @see AliasFor
|
||||||
* @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement)
|
* @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement)
|
||||||
*/
|
*/
|
||||||
abstract class AbstractAliasAwareAnnotationAttributeExtractor implements AnnotationAttributeExtractor {
|
abstract class AbstractAliasAwareAnnotationAttributeExtractor<S> implements AnnotationAttributeExtractor<S> {
|
||||||
|
|
||||||
private final Class<? extends Annotation> annotationType;
|
private final Class<? extends Annotation> annotationType;
|
||||||
|
|
||||||
private final AnnotatedElement annotatedElement;
|
private final AnnotatedElement annotatedElement;
|
||||||
|
|
||||||
private final Object source;
|
private final S source;
|
||||||
|
|
||||||
private final Map<String, String> attributeAliasMap;
|
private final Map<String, String> attributeAliasMap;
|
||||||
|
|
||||||
|
@ -54,7 +55,7 @@ abstract class AbstractAliasAwareAnnotationAttributeExtractor implements Annotat
|
||||||
* @param source the underlying source of annotation attributes; never {@code null}
|
* @param source the underlying source of annotation attributes; never {@code null}
|
||||||
*/
|
*/
|
||||||
AbstractAliasAwareAnnotationAttributeExtractor(Class<? extends Annotation> annotationType,
|
AbstractAliasAwareAnnotationAttributeExtractor(Class<? extends Annotation> annotationType,
|
||||||
AnnotatedElement annotatedElement, Object source) {
|
AnnotatedElement annotatedElement, S source) {
|
||||||
|
|
||||||
Assert.notNull(annotationType, "annotationType must not be null");
|
Assert.notNull(annotationType, "annotationType must not be null");
|
||||||
Assert.notNull(source, "source must not be null");
|
Assert.notNull(source, "source must not be null");
|
||||||
|
@ -76,7 +77,7 @@ abstract class AbstractAliasAwareAnnotationAttributeExtractor implements Annotat
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object getSource() {
|
public final S getSource() {
|
||||||
return this.source;
|
return this.source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,10 @@ import java.lang.reflect.Method;
|
||||||
*
|
*
|
||||||
* @author Sam Brannen
|
* @author Sam Brannen
|
||||||
* @since 4.2
|
* @since 4.2
|
||||||
|
* @param <S> the type of source supported by this extractor
|
||||||
* @see SynthesizedAnnotationInvocationHandler
|
* @see SynthesizedAnnotationInvocationHandler
|
||||||
*/
|
*/
|
||||||
interface AnnotationAttributeExtractor {
|
interface AnnotationAttributeExtractor<S> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the type of annotation that this extractor extracts attribute
|
* Get the type of annotation that this extractor extracts attribute
|
||||||
|
@ -48,7 +49,7 @@ interface AnnotationAttributeExtractor {
|
||||||
/**
|
/**
|
||||||
* Get the underlying source of annotation attributes.
|
* Get the underlying source of annotation attributes.
|
||||||
*/
|
*/
|
||||||
Object getSource();
|
S getSource();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the attribute value from the underlying {@linkplain #getSource source}
|
* Get the attribute value from the underlying {@linkplain #getSource source}
|
||||||
|
|
|
@ -1225,7 +1225,7 @@ public abstract class AnnotationUtils {
|
||||||
return annotation;
|
return annotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
AnnotationAttributeExtractor attributeExtractor =
|
DefaultAnnotationAttributeExtractor attributeExtractor =
|
||||||
new DefaultAnnotationAttributeExtractor(annotation, annotatedElement);
|
new DefaultAnnotationAttributeExtractor(annotation, annotatedElement);
|
||||||
InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor);
|
InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor);
|
||||||
A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(),
|
A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(),
|
||||||
|
@ -1273,7 +1273,7 @@ public abstract class AnnotationUtils {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
AnnotationAttributeExtractor attributeExtractor =
|
MapAnnotationAttributeExtractor attributeExtractor =
|
||||||
new MapAnnotationAttributeExtractor(attributes, annotationType, annotatedElement);
|
new MapAnnotationAttributeExtractor(attributes, annotationType, annotatedElement);
|
||||||
InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor);
|
InvocationHandler handler = new SynthesizedAnnotationInvocationHandler(attributeExtractor);
|
||||||
A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(),
|
A synthesizedAnnotation = (A) Proxy.newProxyInstance(ClassUtils.getDefaultClassLoader(),
|
||||||
|
|
|
@ -34,7 +34,7 @@ import org.springframework.util.ReflectionUtils;
|
||||||
* @see MapAnnotationAttributeExtractor
|
* @see MapAnnotationAttributeExtractor
|
||||||
* @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement)
|
* @see AnnotationUtils#synthesizeAnnotation(Annotation, AnnotatedElement)
|
||||||
*/
|
*/
|
||||||
class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor {
|
class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor<Annotation> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new {@code DefaultAnnotationAttributeExtractor}.
|
* Construct a new {@code DefaultAnnotationAttributeExtractor}.
|
||||||
|
@ -47,11 +47,6 @@ class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Annotation getSource() {
|
|
||||||
return (Annotation) super.getSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object getRawAttributeValue(Method attributeMethod) {
|
protected Object getRawAttributeValue(Method attributeMethod) {
|
||||||
ReflectionUtils.makeAccessible(attributeMethod);
|
ReflectionUtils.makeAccessible(attributeMethod);
|
||||||
|
@ -60,7 +55,7 @@ class DefaultAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAt
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object getRawAttributeValue(String attributeName) {
|
protected Object getRawAttributeValue(String attributeName) {
|
||||||
Method attributeMethod = ReflectionUtils.findMethod(getSource().annotationType(), attributeName);
|
Method attributeMethod = ReflectionUtils.findMethod(getAnnotationType(), attributeName);
|
||||||
return getRawAttributeValue(attributeMethod);
|
return getRawAttributeValue(attributeMethod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ import static org.springframework.core.annotation.AnnotationUtils.*;
|
||||||
* @see DefaultAnnotationAttributeExtractor
|
* @see DefaultAnnotationAttributeExtractor
|
||||||
* @see AnnotationUtils#synthesizeAnnotation(Map, Class, AnnotatedElement)
|
* @see AnnotationUtils#synthesizeAnnotation(Map, Class, AnnotatedElement)
|
||||||
*/
|
*/
|
||||||
class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor {
|
class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttributeExtractor<Map<String, Object>> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a new {@code MapAnnotationAttributeExtractor}.
|
* Construct a new {@code MapAnnotationAttributeExtractor}.
|
||||||
|
@ -57,14 +57,9 @@ class MapAnnotationAttributeExtractor extends AbstractAliasAwareAnnotationAttrib
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Map<String, Object> getSource() {
|
|
||||||
return (Map<String, Object>) super.getSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object getRawAttributeValue(Method attributeMethod) {
|
protected Object getRawAttributeValue(Method attributeMethod) {
|
||||||
return getSource().get(attributeMethod.getName());
|
return getRawAttributeValue(attributeMethod.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -45,7 +45,7 @@ import static org.springframework.util.ReflectionUtils.*;
|
||||||
*/
|
*/
|
||||||
class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
|
class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
|
||||||
|
|
||||||
private final AnnotationAttributeExtractor attributeExtractor;
|
private final AnnotationAttributeExtractor<?> attributeExtractor;
|
||||||
|
|
||||||
private final Map<String, Object> valueCache = new ConcurrentHashMap<String, Object>(8);
|
private final Map<String, Object> valueCache = new ConcurrentHashMap<String, Object>(8);
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ class SynthesizedAnnotationInvocationHandler implements InvocationHandler {
|
||||||
* the supplied {@link AnnotationAttributeExtractor}.
|
* the supplied {@link AnnotationAttributeExtractor}.
|
||||||
* @param attributeExtractor the extractor to delegate to
|
* @param attributeExtractor the extractor to delegate to
|
||||||
*/
|
*/
|
||||||
SynthesizedAnnotationInvocationHandler(AnnotationAttributeExtractor attributeExtractor) {
|
SynthesizedAnnotationInvocationHandler(AnnotationAttributeExtractor<?> attributeExtractor) {
|
||||||
Assert.notNull(attributeExtractor, "AnnotationAttributeExtractor must not be null");
|
Assert.notNull(attributeExtractor, "AnnotationAttributeExtractor must not be null");
|
||||||
this.attributeExtractor = attributeExtractor;
|
this.attributeExtractor = attributeExtractor;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue