diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ee6c0ef92..584647227 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -47,6 +47,7 @@ The type attribute can be add,update,fix,remove. Remove deprecation from RandomStringUtils + ConstructorUtils.invokeConstructor(Class, Object...) regression diff --git a/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java b/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java index 86c5411b4..9523858db 100644 --- a/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java +++ b/src/main/java/org/apache/commons/lang3/reflect/MemberUtils.java @@ -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++) { @@ -270,7 +274,8 @@ private static boolean isMatchingExecutable(final Executable method, final Class } return true; } - return ClassUtils.isAssignable(parameterTypes, methodParameterTypes, true); + + return false; } /** diff --git a/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java b/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java index 9cd39c4f3..06e388edc 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java @@ -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; @@ -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() { @@ -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 @@ -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