提交 a8623dbb 编写于 作者: J Juergen Hoeller

MethodParameter.equals checks nesting level and containing class

Closes gh-23352
上级 4f010423
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -29,6 +29,7 @@ import java.util.Map;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
/**
* Helper class that encapsulates the specification of a method parameter, i.e. a {@link Method}
......@@ -71,7 +72,7 @@ public class MethodParameter {
private final int parameterIndex;
private int nestingLevel = 1;
private int nestingLevel;
/** Map from Integer level to Integer type index */
Map<Integer, Integer> typeIndexesPerLevel;
......@@ -612,7 +613,11 @@ public class MethodParameter {
return false;
}
MethodParameter otherParam = (MethodParameter) other;
return (this.parameterIndex == otherParam.parameterIndex && getMember().equals(otherParam.getMember()));
return (this.containingClass == otherParam.containingClass &&
ObjectUtils.nullSafeEquals(this.typeIndexesPerLevel, otherParam.typeIndexesPerLevel) &&
this.nestingLevel == otherParam.nestingLevel &&
this.parameterIndex == otherParam.parameterIndex &&
getMember().equals(otherParam.getMember()));
}
@Override
......
/*
* Copyright 2002-2018 the original author or authors.
* Copyright 2002-2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -22,6 +22,7 @@ import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.concurrent.Callable;
import org.junit.Before;
......@@ -130,6 +131,44 @@ public class MethodParameterTests {
methodParameter.getGenericParameterType());
}
@Test
public void multipleResolveParameterTypeCalls() throws Exception {
Method method = ArrayList.class.getMethod("get", int.class);
MethodParameter methodParameter = MethodParameter.forMethodOrConstructor(method, -1);
assertEquals(Object.class, methodParameter.getParameterType());
GenericTypeResolver.resolveParameterType(methodParameter, StringList.class);
assertEquals(String.class, methodParameter.getParameterType());
GenericTypeResolver.resolveParameterType(methodParameter, IntegerList.class);
assertEquals(Integer.class, methodParameter.getParameterType());
}
@Test
public void equalsAndHashCodeConsidersContainingClass() throws Exception {
Method method = ArrayList.class.getMethod("get", int.class);
MethodParameter m1 = MethodParameter.forMethodOrConstructor(method, -1);
MethodParameter m2 = MethodParameter.forMethodOrConstructor(method, -1);
MethodParameter m3 = MethodParameter.forMethodOrConstructor(method, -1).nested();
assertEquals(m1, m2);
assertNotEquals(m1, m3);
assertEquals(m1.hashCode(), m2.hashCode());
}
@Test
public void equalsAndHashCodeConsidersNesting() throws Exception {
Method method = ArrayList.class.getMethod("get", int.class);
MethodParameter m1 = MethodParameter.forMethodOrConstructor(method, -1);
GenericTypeResolver.resolveParameterType(m1, StringList.class);
MethodParameter m2 = MethodParameter.forMethodOrConstructor(method, -1);
GenericTypeResolver.resolveParameterType(m2, StringList.class);
MethodParameter m3 = MethodParameter.forMethodOrConstructor(method, -1);
GenericTypeResolver.resolveParameterType(m3, IntegerList.class);
MethodParameter m4 = MethodParameter.forMethodOrConstructor(method, -1);
assertEquals(m1, m2);
assertNotEquals(m1, m3);
assertNotEquals(m1, m4);
assertEquals(m1.hashCode(), m2.hashCode());
}
public int method(String p1, long p2) {
return 42;
......@@ -154,4 +193,12 @@ public class MethodParameterTests {
private @interface Param {
}
@SuppressWarnings("serial")
private static class StringList extends ArrayList<String> {
}
@SuppressWarnings("serial")
private static class IntegerList extends ArrayList<Integer> {
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册