Author: mbenson
Date: Mon Jan 20 17:19:02 2014
New Revision: 1559779
URL: http://svn.apache.org/r1559779
Log:
[LANG-613] ConstructorUtils.getAccessibleConstructor() Does Not Check the
Accessibility of Enclosing Classes
Modified:
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
Modified:
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
URL:
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java?rev=1559779&r1=1559778&r2=1559779&view=diff
==============================================================================
---
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
(original)
+++
commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/reflect/ConstructorUtils.java
Mon Jan 20 17:19:02 2014
@@ -217,7 +217,7 @@ public class ConstructorUtils {
public static <T> Constructor<T> getAccessibleConstructor(final
Constructor<T> ctor) {
Validate.notNull(ctor, "constructor cannot be null");
return MemberUtils.isAccessible(ctor)
- && Modifier.isPublic(ctor.getDeclaringClass().getModifiers())
? ctor : null;
+ && isAccessible(ctor.getDeclaringClass()) ? ctor : null;
}
/**
@@ -279,4 +279,22 @@ public class ConstructorUtils {
return result;
}
+ /**
+ * Learn whether the specified class is generally accessible, i.e. is
+ * declared in an entirely {@code public} manner.
+ * @param type to check
+ * @return {@code true} if {@code type} and any enclosing classes are
+ * {@code public}.
+ */
+ private static boolean isAccessible(final Class<?> type) {
+ Class<?> cls = type;
+ while (cls != null) {
+ if (!Modifier.isPublic(cls.getModifiers())) {
+ return false;
+ }
+ cls = cls.getEnclosingClass();
+ }
+ return true;
+ }
+
}
Modified:
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
URL:
http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java?rev=1559779&r1=1559778&r2=1559779&view=diff
==============================================================================
---
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
(original)
+++
commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/ConstructorUtilsTest.java
Mon Jan 20 17:19:02 2014
@@ -18,7 +18,9 @@ package org.apache.commons.lang3.reflect
import org.junit.Test;
import org.junit.Before;
+
import static org.junit.Assert.*;
+
import java.lang.reflect.Constructor;
import java.util.Arrays;
import java.util.HashMap;
@@ -70,6 +72,12 @@ public class ConstructorUtilsTest {
@SuppressWarnings("unused")
public PrivateClass() {
}
+
+ @SuppressWarnings("unused")
+ public static class PublicInnerClass {
+ public PublicInnerClass() {
+ }
+ }
}
private final Map<Class<?>, Class<?>[]> classCache;
@@ -154,6 +162,7 @@ public class ConstructorUtilsTest {
.getConstructor(ArrayUtils.EMPTY_CLASS_ARRAY)));
assertNull(ConstructorUtils.getAccessibleConstructor(PrivateClass.class
.getConstructor(ArrayUtils.EMPTY_CLASS_ARRAY)));
+
assertNull(ConstructorUtils.getAccessibleConstructor(PrivateClass.PublicInnerClass.class));
}
@Test