Skip to content

Commit

Permalink
LANG-1350: Fix varargs array invokeConstructor
Browse files Browse the repository at this point in the history
If ConstructorUtils.invokeConstructor(Class, Object...) is invoked with
an array of arguments whose classes do not match a constructor exactly
(for example, a subclass is used) and an array is used for a varargs
parameter, then the array is not matched to the varargs parameter type.
  • Loading branch information
bjkail committed Aug 20, 2017
1 parent 05d9518 commit a54613f
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,10 @@ static boolean isMatchingConstructor(final Constructor<?> method, final Class<?>

private static boolean isMatchingExecutable(final Executable method, final Class<?>[] parameterTypes) {
final Class<?>[] methodParameterTypes = method.getParameterTypes();
if (ClassUtils.isAssignable(parameterTypes, methodParameterTypes, true)) {
return true;
}

if (method.isVarArgs()) {
int i;
for (i = 0; i < methodParameterTypes.length - 1 && i < parameterTypes.length; i++) {
Expand All @@ -270,7 +274,8 @@ private static boolean isMatchingExecutable(final Executable method, final Class
}
return true;
}
return ClassUtils.isAssignable(parameterTypes, methodParameterTypes, true);

return false;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,11 @@ public TestBean(final String... s) {
varArgs = s;
}

public TestBean(final BaseClass bc, String... s) {
toString = "(BaseClass, String...)";
varArgs = s;
}

public TestBean(final Integer i, final String... s) {
toString = "(Integer, String...)";
varArgs = s;
Expand All @@ -101,6 +106,10 @@ void verify(final String str, final String[] args) {
}
}

private static class BaseClass {}

private static class SubClass extends BaseClass {}

static class PrivateClass {
@SuppressWarnings("unused")
public PrivateClass() {
Expand Down Expand Up @@ -157,6 +166,8 @@ public void testInvokeConstructor() throws Exception {
.verify("(String...)", new String[]{"a", "b"});
ConstructorUtils.invokeConstructor(TestBean.class, NumberUtils.INTEGER_ONE, "a", "b")
.verify("(Integer, String...)", new String[]{"a", "b"});
ConstructorUtils.invokeConstructor(TestBean.class, new SubClass(), new String[]{"a", "b"})
.verify("(BaseClass, String...)", new String[]{"a", "b"});
}

@Test
Expand Down Expand Up @@ -252,6 +263,9 @@ public void testGetMatchingAccessibleMethod() throws Exception {
singletonArray(Double.class), singletonArray(Double.TYPE));
expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
singletonArray(Double.TYPE), singletonArray(Double.TYPE));
expectMatchingAccessibleConstructorParameterTypes(TestBean.class,
new Class<?>[]{SubClass.class, String[].class},
new Class<?>[]{BaseClass.class, String[].class});
}

@Test
Expand Down

0 comments on commit a54613f

Please sign in to comment.