Revert "Cache MethodParameter annotation lookup results"

This reverts commit c10d63dc01.
This commit is contained in:
Juergen Hoeller 2012-12-12 23:57:50 +01:00
parent 33471a1744
commit a35b9c9431
2 changed files with 6 additions and 78 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2011 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -26,8 +26,6 @@ import java.lang.reflect.Type;
import java.lang.reflect.TypeVariable; import java.lang.reflect.TypeVariable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.springframework.util.Assert; import org.springframework.util.Assert;
@ -39,21 +37,11 @@ import org.springframework.util.Assert;
* @author Juergen Hoeller * @author Juergen Hoeller
* @author Rob Harrop * @author Rob Harrop
* @author Andy Clement * @author Andy Clement
* @author Nikita Tovstoles
* @author Chris Beams
* @since 2.0 * @since 2.0
* @see GenericCollectionTypeResolver * @see GenericCollectionTypeResolver
*/ */
public class MethodParameter { public class MethodParameter {
private static final Annotation[][] EMPTY_ANNOTATION_MATRIX = new Annotation[0][0];
private static final Annotation[] EMPTY_ANNOTATION_ARRAY = new Annotation[0];
static final ConcurrentMap<Method, Annotation[][]> methodParamAnnotationsCache =
new ConcurrentHashMap<Method, Annotation[][]>();
private final Method method; private final Method method;
private final Constructor constructor; private final Constructor constructor;
@ -291,7 +279,7 @@ public class MethodParameter {
public Annotation[] getParameterAnnotations() { public Annotation[] getParameterAnnotations() {
if (this.parameterAnnotations == null) { if (this.parameterAnnotations == null) {
Annotation[][] annotationArray = (this.method != null ? Annotation[][] annotationArray = (this.method != null ?
getMethodParameterAnnotations(this.method) : this.constructor.getParameterAnnotations()); this.method.getParameterAnnotations() : this.constructor.getParameterAnnotations());
if (this.parameterIndex >= 0 && this.parameterIndex < annotationArray.length) { if (this.parameterIndex >= 0 && this.parameterIndex < annotationArray.length) {
this.parameterAnnotations = annotationArray[this.parameterIndex]; this.parameterAnnotations = annotationArray[this.parameterIndex];
} }
@ -450,41 +438,6 @@ public class MethodParameter {
} }
} }
/**
* Return the parameter annotations for the given method, retrieving cached values
* if a lookup has already been performed for this method, otherwise perform a fresh
* lookup and populate the cache with the result before returning. <strong>For
* internal use only.</strong>
* @param method the method to introspect for parameter annotations
*/
static Annotation[][] getMethodParameterAnnotations(Method method) {
Assert.notNull(method);
Annotation[][] result = methodParamAnnotationsCache.get(method);
if (result == null) {
result = method.getParameterAnnotations();
if(result.length == 0) {
result = EMPTY_ANNOTATION_MATRIX;
}
else {
for (int i = 0; i < result.length; i++) {
if (result[i].length == 0) {
result[i] = EMPTY_ANNOTATION_ARRAY;
}
}
}
methodParamAnnotationsCache.put(method, result);
}
//always return deep copy to prevent caller from modifying cache state
Annotation[][] resultCopy = new Annotation[result.length][0];
for(int i = 0; i < result.length; i++) {
resultCopy[i] = result[i].clone();
}
return resultCopy;
}
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if (this == obj) { if (this == obj) {
@ -506,6 +459,7 @@ public class MethodParameter {
return false; return false;
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = this.hash; int result = this.hash;

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2012 the original author or authors. * Copyright 2002-2011 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -16,11 +16,6 @@
package org.springframework.core; package org.springframework.core;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import org.junit.Before; import org.junit.Before;
@ -30,7 +25,6 @@ import static org.junit.Assert.*;
/** /**
* @author Arjen Poutsma * @author Arjen Poutsma
* @author Nikita Tovstoles
*/ */
public class MethodParameterTests { public class MethodParameterTests {
@ -49,6 +43,7 @@ public class MethodParameterTests {
} }
@Test @Test
public void testEquals() throws NoSuchMethodException { public void testEquals() throws NoSuchMethodException {
assertEquals(stringParameter, stringParameter); assertEquals(stringParameter, stringParameter);
@ -82,30 +77,9 @@ public class MethodParameterTests {
assertTrue(longParameter.hashCode() != methodParameter.hashCode()); assertTrue(longParameter.hashCode() != methodParameter.hashCode());
} }
@Test
public void testGetMethodParamaterAnnotations() {
Method method = stringParameter.getMethod();
Annotation[][] expectedAnnotations = method.getParameterAnnotations();
assertEquals(2, expectedAnnotations.length);
assertEquals(DummyAnnotation.class, expectedAnnotations[0][0].annotationType());
//start with empty cache public int method(String p1, long p2) {
MethodParameter.methodParamAnnotationsCache.clear();
//check correctness
assertArrayEquals(expectedAnnotations, MethodParameter.getMethodParameterAnnotations(method));
//check that return value's been cached
assertArrayEquals(expectedAnnotations, MethodParameter.methodParamAnnotationsCache.get(method));
}
public int method(@DummyAnnotation String p1, long p2) {
return 42; return 42;
} }
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface DummyAnnotation {
}
} }