This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push: new 69c4dddbd [LANG-1697] TypeUtils.getRawType() throws a NullPointerException on Wildcard GenericArrayType 69c4dddbd is described below commit 69c4dddbdecc3bf0bfb565e60d6a9a0f7f0eaea0 Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Tue Jul 11 17:21:11 2023 -0400 [LANG-1697] TypeUtils.getRawType() throws a NullPointerException on Wildcard GenericArrayType --- src/changes/changes.xml | 1 + .../apache/commons/lang3/reflect/TypeUtils.java | 2 +- .../commons/lang3/reflect/TypeUtilsTest.java | 38 +++++++++++++--------- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index b9930b0d2..26d7be48c 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -122,6 +122,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="fix" dev="ggregory" due-to="step-security-bot, Gary Gregory">[StepSecurity] ci: Harden GitHub Actions #1067.</action> <action type="fix" dev="ggregory" due-to="Dimitrios Efthymiou">Update Javadoc for the insert methods in ArrayUtils #1078.</action> <action type="fix" dev="ggregory" due-to="Gary Gregory">Deprecate ExceptionUtils.ExceptionUtils().</action> + <action issue="LANG-1697" type="fix" dev="ggregory" due-to="Jan Arne Sparka, Gary Gregory">TypeUtils.getRawType() throws a NullPointerException on Wildcard GenericArrayType.</action> <!-- ADD --> <action type="add" dev="ggregory" due-to="Gary Gregory">Add GitHub coverage.yml.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add EnumUtils.getEnumSystemProperty(...).</action> diff --git a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java index 09e65b749..f959d7a99 100644 --- a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java +++ b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java @@ -802,7 +802,7 @@ public class TypeUtils { .getGenericComponentType(), assigningType); // create array type from raw component type and return its class - return Array.newInstance(rawComponentType, 0).getClass(); + return rawComponentType != null ? Array.newInstance(rawComponentType, 0).getClass() : null; } // (hand-waving) this is not the method you're looking for diff --git a/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java b/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java index 67de3b19e..f5407d722 100644 --- a/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java +++ b/src/test/java/org/apache/commons/lang3/reflect/TypeUtilsTest.java @@ -346,27 +346,33 @@ public class TypeUtilsTest<B> extends AbstractLangTest { @Test public void testGetRawType() throws SecurityException, NoSuchFieldException { - final Type stringParentFieldType = GenericTypeHolder.class.getDeclaredField("stringParent") - .getGenericType(); - final Type integerParentFieldType = GenericTypeHolder.class.getDeclaredField("integerParent") - .getGenericType(); + final Type stringParentFieldType = GenericTypeHolder.class.getDeclaredField("stringParent").getGenericType(); + final Type integerParentFieldType = GenericTypeHolder.class.getDeclaredField("integerParent").getGenericType(); final Type foosFieldType = GenericTypeHolder.class.getDeclaredField("foos").getGenericType(); final Type genericParentT = GenericParent.class.getTypeParameters()[0]; assertEquals(GenericParent.class, TypeUtils.getRawType(stringParentFieldType, null)); - assertEquals(GenericParent.class, TypeUtils.getRawType(integerParentFieldType, - null)); + assertEquals(GenericParent.class, TypeUtils.getRawType(integerParentFieldType, null)); assertEquals(List.class, TypeUtils.getRawType(foosFieldType, null)); - assertEquals(String.class, TypeUtils.getRawType(genericParentT, - StringParameterizedChild.class)); - assertEquals(String.class, TypeUtils.getRawType(genericParentT, - stringParentFieldType)); - assertEquals(Foo.class, TypeUtils.getRawType(Iterable.class.getTypeParameters()[0], - foosFieldType)); - assertEquals(Foo.class, TypeUtils.getRawType(List.class.getTypeParameters()[0], - foosFieldType)); + assertEquals(String.class, TypeUtils.getRawType(genericParentT, StringParameterizedChild.class)); + assertEquals(String.class, TypeUtils.getRawType(genericParentT, stringParentFieldType)); + assertEquals(Foo.class, TypeUtils.getRawType(Iterable.class.getTypeParameters()[0], foosFieldType)); + assertEquals(Foo.class, TypeUtils.getRawType(List.class.getTypeParameters()[0], foosFieldType)); assertNull(TypeUtils.getRawType(genericParentT, GenericParent.class)); - assertEquals(GenericParent[].class, TypeUtils.getRawType(GenericTypeHolder.class - .getDeclaredField("barParents").getGenericType(), null)); + assertEquals(GenericParent[].class, TypeUtils.getRawType(GenericTypeHolder.class.getDeclaredField("barParents").getGenericType(), null)); + } + + /** + * Tests https://issues.apache.org/jira/browse/LANG-1697 + */ + @Test + public void testGetRawType_LANG_1697() throws NoSuchFieldException { + assertEquals(int[].class, TypeUtils.getRawType(TypeUtils.genericArrayType(Integer.TYPE), Integer.TYPE)); + // LANG-1697: + assertNull(TypeUtils.getRawType(TypeUtils.genericArrayType(TypeUtils.WILDCARD_ALL), null)); + // TODO: Is this correct? + assertNull(TypeUtils.getRawType(TypeUtils.genericArrayType(TypeUtils.WILDCARD_ALL), TypeUtils.WILDCARD_ALL)); + // TODO: Is this correct? + assertNull(TypeUtils.getRawType(TypeUtils.genericArrayType(TypeUtils.WILDCARD_ALL), Integer.TYPE)); } @Test