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


Reply via email to