Turned ArgumentsMatchKind and ArgumentsMatchInfo to package-visible
This commit is contained in:
parent
abff789b0f
commit
8da9e5466a
|
|
@ -55,7 +55,7 @@ public class ReflectionHelper {
|
|||
Assert.isTrue(expectedArgTypes.size() == suppliedArgTypes.size(),
|
||||
"Expected argument types and supplied argument types should be arrays of same length");
|
||||
|
||||
ArgsMatchKind match = ArgsMatchKind.EXACT;
|
||||
ArgumentsMatchKind match = ArgumentsMatchKind.EXACT;
|
||||
for (int i = 0; i < expectedArgTypes.size() && match != null; i++) {
|
||||
TypeDescriptor suppliedArg = suppliedArgTypes.get(i);
|
||||
TypeDescriptor expectedArg = expectedArgTypes.get(i);
|
||||
|
|
@ -68,12 +68,12 @@ public class ReflectionHelper {
|
|||
}
|
||||
else {
|
||||
if (suppliedArg.isAssignableTo(expectedArg)) {
|
||||
if (match != ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgsMatchKind.CLOSE;
|
||||
if (match != ArgumentsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgumentsMatchKind.CLOSE;
|
||||
}
|
||||
}
|
||||
else if (typeConverter.canConvert(suppliedArg, expectedArg)) {
|
||||
match = ArgsMatchKind.REQUIRES_CONVERSION;
|
||||
match = ArgumentsMatchKind.REQUIRES_CONVERSION;
|
||||
}
|
||||
else {
|
||||
match = null;
|
||||
|
|
@ -144,7 +144,7 @@ public class ReflectionHelper {
|
|||
Assert.isTrue(expectedArgTypes.get(expectedArgTypes.size() - 1).isArray(),
|
||||
"Final expected argument should be array type (the varargs parameter)");
|
||||
|
||||
ArgsMatchKind match = ArgsMatchKind.EXACT;
|
||||
ArgumentsMatchKind match = ArgumentsMatchKind.EXACT;
|
||||
|
||||
// Check up until the varargs argument:
|
||||
|
||||
|
|
@ -161,12 +161,12 @@ public class ReflectionHelper {
|
|||
else {
|
||||
if (!expectedArg.equals(suppliedArg)) {
|
||||
if (suppliedArg.isAssignableTo(expectedArg)) {
|
||||
if (match != ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgsMatchKind.CLOSE;
|
||||
if (match != ArgumentsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgumentsMatchKind.CLOSE;
|
||||
}
|
||||
}
|
||||
else if (typeConverter.canConvert(suppliedArg, expectedArg)) {
|
||||
match = ArgsMatchKind.REQUIRES_CONVERSION;
|
||||
match = ArgumentsMatchKind.REQUIRES_CONVERSION;
|
||||
}
|
||||
else {
|
||||
match = null;
|
||||
|
|
@ -202,12 +202,12 @@ public class ReflectionHelper {
|
|||
else {
|
||||
if (varargsParamType != suppliedArg.getType()) {
|
||||
if (ClassUtils.isAssignable(varargsParamType, suppliedArg.getType())) {
|
||||
if (match != ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgsMatchKind.CLOSE;
|
||||
if (match != ArgumentsMatchKind.REQUIRES_CONVERSION) {
|
||||
match = ArgumentsMatchKind.CLOSE;
|
||||
}
|
||||
}
|
||||
else if (typeConverter.canConvert(suppliedArg, TypeDescriptor.valueOf(varargsParamType))) {
|
||||
match = ArgsMatchKind.REQUIRES_CONVERSION;
|
||||
match = ArgumentsMatchKind.REQUIRES_CONVERSION;
|
||||
}
|
||||
else {
|
||||
match = null;
|
||||
|
|
@ -331,8 +331,9 @@ public class ReflectionHelper {
|
|||
// Check if repackaging is needed:
|
||||
if (parameterCount != args.length ||
|
||||
requiredParameterTypes[parameterCount - 1] !=
|
||||
(args[argumentCount - 1] == null ? null : args[argumentCount - 1].getClass())) {
|
||||
int arraySize = 0; // zero size array if nothing to pass as the varargs parameter
|
||||
(args[argumentCount - 1] != null ? args[argumentCount - 1].getClass() : null)) {
|
||||
|
||||
int arraySize = 0; // zero size array if nothing to pass as the varargs parameter
|
||||
if (argumentCount >= parameterCount) {
|
||||
arraySize = argumentCount - (parameterCount - 1);
|
||||
}
|
||||
|
|
@ -341,93 +342,26 @@ public class ReflectionHelper {
|
|||
Object[] newArgs = new Object[parameterCount];
|
||||
System.arraycopy(args, 0, newArgs, 0, newArgs.length - 1);
|
||||
|
||||
// Now sort out the final argument, which is the varargs one. Before entering this
|
||||
// method the arguments should have been converted to the box form of the required type.
|
||||
Class<?> componentType = requiredParameterTypes[parameterCount-1].getComponentType();
|
||||
if (componentType.isPrimitive()) {
|
||||
if (componentType == Integer.TYPE) {
|
||||
int[] repackagedArguments = (int[]) Array.newInstance(componentType,
|
||||
arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Integer) args[parameterCount + i - 1]).intValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Float.TYPE) {
|
||||
float[] repackagedArguments = (float[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Float) args[parameterCount + i - 1]).floatValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Double.TYPE) {
|
||||
double[] repackagedArguments = (double[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Double) args[parameterCount + i - 1]).doubleValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Short.TYPE) {
|
||||
short[] repackagedArguments = (short[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Short) args[parameterCount + i - 1]).shortValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Character.TYPE) {
|
||||
char[] repackagedArguments = (char[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Character) args[parameterCount + i - 1]).charValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Byte.TYPE) {
|
||||
byte[] repackagedArguments = (byte[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Byte) args[parameterCount + i - 1]).byteValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Boolean.TYPE) {
|
||||
boolean[] repackagedArguments = (boolean[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Boolean) args[parameterCount + i - 1]).booleanValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
else if (componentType == Long.TYPE) {
|
||||
long[] repackagedArguments = (long[]) Array.newInstance(
|
||||
componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
repackagedArguments[i] = ((Long) args[parameterCount + i - 1]).longValue();
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
}
|
||||
}
|
||||
else {
|
||||
Object[] repackagedArguments = (Object[]) Array.newInstance(componentType, arraySize);
|
||||
// Copy all but the varargs arguments
|
||||
System.arraycopy(args, parameterCount - 1, repackagedArguments, 0, arraySize);
|
||||
newArgs[newArgs.length - 1] = repackagedArguments;
|
||||
// Now sort out the final argument, which is the varargs one. Before entering this method,
|
||||
// the arguments should have been converted to the box form of the required type.
|
||||
Class<?> componentType = requiredParameterTypes[parameterCount - 1].getComponentType();
|
||||
Object repackagedArgs = Array.newInstance(componentType, arraySize);
|
||||
for (int i = 0; i < arraySize; i++) {
|
||||
Array.set(repackagedArgs, i, args[parameterCount - 1 + i]);
|
||||
}
|
||||
newArgs[newArgs.length - 1] = repackagedArgs;
|
||||
return newArgs;
|
||||
}
|
||||
return args;
|
||||
}
|
||||
|
||||
|
||||
public static enum ArgsMatchKind {
|
||||
static enum ArgumentsMatchKind {
|
||||
|
||||
/** An exact match is where the parameter types exactly match what the method/constructor being invoked is expecting */
|
||||
/** An exact match is where the parameter types exactly match what the method/constructor is expecting */
|
||||
EXACT,
|
||||
|
||||
/** A close match is where the parameter types either exactly match or are assignment compatible with the method/constructor being invoked */
|
||||
/** A close match is where the parameter types either exactly match or are assignment-compatible */
|
||||
CLOSE,
|
||||
|
||||
/** A conversion match is where the type converter must be used to transform some of the parameter types */
|
||||
|
|
@ -441,24 +375,24 @@ public class ReflectionHelper {
|
|||
* If the kind indicates that conversion is required for some of the arguments then the arguments that require
|
||||
* conversion are listed in the argsRequiringConversion array.
|
||||
*/
|
||||
public static class ArgumentsMatchInfo {
|
||||
static class ArgumentsMatchInfo {
|
||||
|
||||
public final ArgsMatchKind kind;
|
||||
private final ArgumentsMatchKind kind;
|
||||
|
||||
ArgumentsMatchInfo(ArgsMatchKind kind) {
|
||||
ArgumentsMatchInfo(ArgumentsMatchKind kind) {
|
||||
this.kind = kind;
|
||||
}
|
||||
|
||||
public boolean isExactMatch() {
|
||||
return (this.kind == ArgsMatchKind.EXACT);
|
||||
return (this.kind == ArgumentsMatchKind.EXACT);
|
||||
}
|
||||
|
||||
public boolean isCloseMatch() {
|
||||
return (this.kind == ArgsMatchKind.CLOSE);
|
||||
return (this.kind == ArgumentsMatchKind.CLOSE);
|
||||
}
|
||||
|
||||
public boolean isMatchRequiringConversion() {
|
||||
return (this.kind == ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
return (this.kind == ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -32,8 +32,7 @@ import org.springframework.expression.EvaluationException;
|
|||
import org.springframework.expression.TypeConverter;
|
||||
|
||||
/**
|
||||
* A constructor resolver that uses reflection to locate the constructor that should be
|
||||
* invoked
|
||||
* A constructor resolver that uses reflection to locate the constructor that should be invoked.
|
||||
*
|
||||
* @author Andy Clement
|
||||
* @author Juergen Hoeller
|
||||
|
|
@ -44,12 +43,10 @@ public class ReflectiveConstructorResolver implements ConstructorResolver {
|
|||
/**
|
||||
* Locate a constructor on the type. There are three kinds of match that might occur:
|
||||
* <ol>
|
||||
* <li>An exact match where the types of the arguments match the types of the
|
||||
* constructor
|
||||
* <li>An in-exact match where the types we are looking for are subtypes of those
|
||||
* defined on the constructor
|
||||
* <li>A match where we are able to convert the arguments into those expected by the
|
||||
* constructor, according to the registered type converter.
|
||||
* <li>An exact match where the types of the arguments match the types of the constructor
|
||||
* <li>An in-exact match where the types we are looking for are subtypes of those defined on the constructor
|
||||
* <li>A match where we are able to convert the arguments into those expected by the constructor, according to the
|
||||
* registered type converter.
|
||||
* </ol>
|
||||
*/
|
||||
@Override
|
||||
|
|
@ -93,11 +90,10 @@ public class ReflectiveConstructorResolver implements ConstructorResolver {
|
|||
matchInfo = ReflectionHelper.compareArguments(paramDescriptors, argumentTypes, typeConverter);
|
||||
}
|
||||
if (matchInfo != null) {
|
||||
if (matchInfo.kind == ReflectionHelper.ArgsMatchKind.EXACT) {
|
||||
if (matchInfo.isExactMatch()) {
|
||||
return new ReflectiveConstructorExecutor(ctor);
|
||||
}
|
||||
else if (matchInfo.kind == ReflectionHelper.ArgsMatchKind.CLOSE ||
|
||||
matchInfo.kind == ReflectionHelper.ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
else if (matchInfo.isCloseMatch() || matchInfo.isMatchRequiringConversion()) {
|
||||
closeMatch = ctor;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,8 +42,8 @@ import org.springframework.expression.spel.SpelEvaluationException;
|
|||
import org.springframework.expression.spel.SpelMessage;
|
||||
|
||||
/**
|
||||
* Reflection-based {@link MethodResolver} used by default in
|
||||
* {@link StandardEvaluationContext} unless explicit method resolvers have been specified.
|
||||
* Reflection-based {@link MethodResolver} used by default in {@link StandardEvaluationContext}
|
||||
* unless explicit method resolvers have been specified.
|
||||
*
|
||||
* @author Andy Clement
|
||||
* @author Juergen Hoeller
|
||||
|
|
@ -124,7 +124,6 @@ public class ReflectiveMethodResolver implements MethodResolver {
|
|||
|
||||
Method closeMatch = null;
|
||||
int closeMatchDistance = Integer.MAX_VALUE;
|
||||
int[] argsToConvert = null;
|
||||
Method matchRequiringConversion = null;
|
||||
boolean multipleOptions = false;
|
||||
|
||||
|
|
@ -145,10 +144,10 @@ public class ReflectiveMethodResolver implements MethodResolver {
|
|||
matchInfo = ReflectionHelper.compareArguments(paramDescriptors, argumentTypes, typeConverter);
|
||||
}
|
||||
if (matchInfo != null) {
|
||||
if (matchInfo.kind == ReflectionHelper.ArgsMatchKind.EXACT) {
|
||||
if (matchInfo.isExactMatch()) {
|
||||
return new ReflectiveMethodExecutor(method);
|
||||
}
|
||||
else if (matchInfo.kind == ReflectionHelper.ArgsMatchKind.CLOSE) {
|
||||
else if (matchInfo.isCloseMatch()) {
|
||||
if (!this.useDistance) {
|
||||
closeMatch = method;
|
||||
}
|
||||
|
|
@ -161,7 +160,7 @@ public class ReflectiveMethodResolver implements MethodResolver {
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (matchInfo.kind == ReflectionHelper.ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
else if (matchInfo.isMatchRequiringConversion()) {
|
||||
if (matchRequiringConversion != null) {
|
||||
multipleOptions = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ import org.springframework.expression.spel.SpelMessage;
|
|||
import org.springframework.expression.spel.SpelUtilities;
|
||||
import org.springframework.expression.spel.ast.FormatHelper;
|
||||
import org.springframework.expression.spel.standard.SpelExpression;
|
||||
import org.springframework.expression.spel.support.ReflectionHelper.ArgsMatchKind;
|
||||
import org.springframework.expression.spel.support.ReflectionHelper.ArgumentsMatchKind;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
|
|
@ -107,10 +107,10 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
StandardTypeConverter tc = new StandardTypeConverter();
|
||||
|
||||
// Calling foo(String) with (String) is exact match
|
||||
checkMatch(new Class[] {String.class}, new Class[] {String.class}, tc,ArgsMatchKind.EXACT);
|
||||
checkMatch(new Class[] {String.class}, new Class[] {String.class}, tc, ReflectionHelper.ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Calling foo(String,Integer) with (String,Integer) is exact match
|
||||
checkMatch(new Class[] {String.class, Integer.class}, new Class[] {String.class, Integer.class}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch(new Class[] {String.class, Integer.class}, new Class[] {String.class, Integer.class}, tc, ArgumentsMatchKind.EXACT);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -118,13 +118,13 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
StandardTypeConverter tc = new StandardTypeConverter();
|
||||
|
||||
// Calling foo(List) with (ArrayList) is close match (no conversion required)
|
||||
checkMatch(new Class[] {ArrayList.class}, new Class[] {List.class}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {ArrayList.class}, new Class[] {List.class}, tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (Sub,String) on call to foo(Super,String) is close match
|
||||
checkMatch(new Class[] {Sub.class, String.class}, new Class[] {Super.class, String.class}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {Sub.class, String.class}, new Class[] {Super.class, String.class}, tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (String,Sub) on call to foo(String,Super) is close match
|
||||
checkMatch(new Class[] {String.class, Sub.class}, new Class[] {String.class, Super.class}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {String.class, Sub.class}, new Class[] {String.class, Super.class}, tc, ArgumentsMatchKind.CLOSE);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -132,13 +132,13 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
StandardTypeConverter tc = new StandardTypeConverter();
|
||||
|
||||
// Calling foo(String,int) with (String,Integer) requires boxing conversion of argument one
|
||||
checkMatch(new Class[] {String.class, Integer.TYPE}, new Class[] {String.class,Integer.class},tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {String.class, Integer.TYPE}, new Class[] {String.class,Integer.class},tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (int,String) on call to foo(Integer,String) requires boxing conversion of argument zero
|
||||
checkMatch(new Class[] {Integer.TYPE, String.class}, new Class[] {Integer.class, String.class},tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {Integer.TYPE, String.class}, new Class[] {Integer.class, String.class},tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (int,Sub) on call to foo(Integer,Super) requires boxing conversion of argument zero
|
||||
checkMatch(new Class[] {Integer.TYPE, Sub.class}, new Class[] {Integer.class, Super.class}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch(new Class[] {Integer.TYPE, Sub.class}, new Class[] {Integer.class, Super.class}, tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (int,Sub,boolean) on call to foo(Integer,Super,Boolean) requires boxing conversion of arguments zero and two
|
||||
// TODO checkMatch(new Class[] {Integer.TYPE, Sub.class, Boolean.TYPE}, new Class[] {Integer.class, Super.class, Boolean.class}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
|
|
@ -159,34 +159,34 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
Class<?> integerArrayClass = new Integer[0].getClass();
|
||||
|
||||
// Passing (String[]) on call to (String[]) is exact match
|
||||
checkMatch2(new Class[] {stringArrayClass}, new Class[] {stringArrayClass}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch2(new Class[] {stringArrayClass}, new Class[] {stringArrayClass}, tc, ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Passing (Integer, String[]) on call to (Integer, String[]) is exact match
|
||||
checkMatch2(new Class[] {Integer.class, stringArrayClass}, new Class[] {Integer.class, stringArrayClass}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch2(new Class[] {Integer.class, stringArrayClass}, new Class[] {Integer.class, stringArrayClass}, tc, ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Passing (String, Integer, String[]) on call to (String, String, String[]) is exact match
|
||||
checkMatch2(new Class[] {String.class, Integer.class, stringArrayClass}, new Class[] {String.class,Integer.class, stringArrayClass}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch2(new Class[] {String.class, Integer.class, stringArrayClass}, new Class[] {String.class,Integer.class, stringArrayClass}, tc, ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Passing (Sub, String[]) on call to (Super, String[]) is exact match
|
||||
checkMatch2(new Class[] {Sub.class, stringArrayClass}, new Class[] {Super.class,stringArrayClass}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch2(new Class[] {Sub.class, stringArrayClass}, new Class[] {Super.class,stringArrayClass}, tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (Integer, String[]) on call to (String, String[]) is exact match
|
||||
checkMatch2(new Class[] {Integer.class, stringArrayClass}, new Class[] {String.class, stringArrayClass}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
checkMatch2(new Class[] {Integer.class, stringArrayClass}, new Class[] {String.class, stringArrayClass}, tc, ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
|
||||
// Passing (Integer, Sub, String[]) on call to (String, Super, String[]) is exact match
|
||||
checkMatch2(new Class[] {Integer.class, Sub.class, String[].class}, new Class[] {String.class,Super .class, String[].class}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
checkMatch2(new Class[] {Integer.class, Sub.class, String[].class}, new Class[] {String.class,Super .class, String[].class}, tc, ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
|
||||
// Passing (String) on call to (String[]) is exact match
|
||||
checkMatch2(new Class[] {String.class}, new Class[] {stringArrayClass}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch2(new Class[] {String.class}, new Class[] {stringArrayClass}, tc, ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Passing (Integer,String) on call to (Integer,String[]) is exact match
|
||||
checkMatch2(new Class[] {Integer.class, String.class}, new Class[] {Integer.class, stringArrayClass}, tc, ArgsMatchKind.EXACT);
|
||||
checkMatch2(new Class[] {Integer.class, String.class}, new Class[] {Integer.class, stringArrayClass}, tc, ArgumentsMatchKind.EXACT);
|
||||
|
||||
// Passing (String) on call to (Integer[]) is conversion match (String to Integer)
|
||||
checkMatch2(new Class[] {String.class}, new Class[] {integerArrayClass}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
checkMatch2(new Class[] {String.class}, new Class[] {integerArrayClass}, tc, ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
|
||||
// Passing (Sub) on call to (Super[]) is close match
|
||||
checkMatch2(new Class[] {Sub.class}, new Class[] {new Super[0].getClass()}, tc, ArgsMatchKind.CLOSE);
|
||||
checkMatch2(new Class[] {Sub.class}, new Class[] {new Super[0].getClass()}, tc, ArgumentsMatchKind.CLOSE);
|
||||
|
||||
// Passing (Super) on call to (Sub[]) is not a match
|
||||
checkMatch2(new Class[] {Super.class}, new Class[] {new Sub[0].getClass()}, tc, null);
|
||||
|
|
@ -199,9 +199,9 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
|
||||
checkMatch2(new Class[] {Integer.class, Integer.class, String.class}, new Class[] {String.class, String.class, Super[].class}, tc, null);
|
||||
|
||||
checkMatch2(new Class[] {Integer.class, Integer.class, Sub.class}, new Class[] {String.class, String.class, Super[].class}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
checkMatch2(new Class[] {Integer.class, Integer.class, Sub.class}, new Class[] {String.class, String.class, Super[].class}, tc, ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
|
||||
checkMatch2(new Class[] {Integer.class, Integer.class, Integer.class}, new Class[] {Integer.class, String[].class}, tc, ArgsMatchKind.REQUIRES_CONVERSION);
|
||||
checkMatch2(new Class[] {Integer.class, Integer.class, Integer.class}, new Class[] {Integer.class, String[].class}, tc, ArgumentsMatchKind.REQUIRES_CONVERSION);
|
||||
// what happens on (Integer,String) passed to (Integer[]) ?
|
||||
}
|
||||
|
||||
|
|
@ -481,7 +481,7 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
/**
|
||||
* Used to validate the match returned from a compareArguments call.
|
||||
*/
|
||||
private void checkMatch(Class[] inputTypes, Class[] expectedTypes, StandardTypeConverter typeConverter, ArgsMatchKind expectedMatchKind) {
|
||||
private void checkMatch(Class[] inputTypes, Class[] expectedTypes, StandardTypeConverter typeConverter, ArgumentsMatchKind expectedMatchKind) {
|
||||
ReflectionHelper.ArgumentsMatchInfo matchInfo = ReflectionHelper.compareArguments(getTypeDescriptors(expectedTypes), getTypeDescriptors(inputTypes), typeConverter);
|
||||
if (expectedMatchKind == null) {
|
||||
assertNull("Did not expect them to match in any way", matchInfo);
|
||||
|
|
@ -490,13 +490,13 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
assertNotNull("Should not be a null match", matchInfo);
|
||||
}
|
||||
|
||||
if (expectedMatchKind == ArgsMatchKind.EXACT) {
|
||||
if (expectedMatchKind == ArgumentsMatchKind.EXACT) {
|
||||
assertTrue(matchInfo.isExactMatch());
|
||||
}
|
||||
else if (expectedMatchKind == ArgsMatchKind.CLOSE) {
|
||||
else if (expectedMatchKind == ArgumentsMatchKind.CLOSE) {
|
||||
assertTrue(matchInfo.isCloseMatch());
|
||||
}
|
||||
else if (expectedMatchKind == ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
else if (expectedMatchKind == ArgumentsMatchKind.REQUIRES_CONVERSION) {
|
||||
assertTrue("expected to be a match requiring conversion, but was " + matchInfo, matchInfo.isMatchRequiringConversion());
|
||||
}
|
||||
}
|
||||
|
|
@ -504,22 +504,22 @@ public class ReflectionHelperTests extends ExpressionTestCase {
|
|||
/**
|
||||
* Used to validate the match returned from a compareArguments call.
|
||||
*/
|
||||
private void checkMatch2(Class[] inputTypes, Class[] expectedTypes, StandardTypeConverter typeConverter, ArgsMatchKind expectedMatchKind) {
|
||||
private void checkMatch2(Class[] inputTypes, Class[] expectedTypes, StandardTypeConverter typeConverter, ArgumentsMatchKind expectedMatchKind) {
|
||||
ReflectionHelper.ArgumentsMatchInfo matchInfo = ReflectionHelper.compareArgumentsVarargs(getTypeDescriptors(expectedTypes), getTypeDescriptors(inputTypes), typeConverter);
|
||||
if (expectedMatchKind == null) {
|
||||
assertNull("Did not expect them to match in any way: "+matchInfo, matchInfo);
|
||||
assertNull("Did not expect them to match in any way: " + matchInfo, matchInfo);
|
||||
}
|
||||
else {
|
||||
assertNotNull("Should not be a null match", matchInfo);
|
||||
}
|
||||
|
||||
if (expectedMatchKind == ArgsMatchKind.EXACT) {
|
||||
if (expectedMatchKind == ArgumentsMatchKind.EXACT) {
|
||||
assertTrue(matchInfo.isExactMatch());
|
||||
}
|
||||
else if (expectedMatchKind == ArgsMatchKind.CLOSE) {
|
||||
else if (expectedMatchKind == ArgumentsMatchKind.CLOSE) {
|
||||
assertTrue(matchInfo.isCloseMatch());
|
||||
}
|
||||
else if (expectedMatchKind == ArgsMatchKind.REQUIRES_CONVERSION) {
|
||||
else if (expectedMatchKind == ArgumentsMatchKind.REQUIRES_CONVERSION) {
|
||||
assertTrue("expected to be a match requiring conversion, but was " + matchInfo, matchInfo.isMatchRequiringConversion());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue