--- old/src/java.base/share/classes/jdk/internal/reflect/Reflection.java 2017-03-19 23:28:04.108676032 +0100 +++ new/src/java.base/share/classes/jdk/internal/reflect/Reflection.java 2017-03-19 23:28:03.957678636 +0100 @@ -108,29 +108,34 @@ } /** - * Verify access to a member, returning {@code false} if no access + * Verify access to a member and return {@code true} if it is granted. + * + * @param currentClass the class performing the access + * @param memberClass the declaring class of the member being accessed + * @param targetClass the class of target object if accessing instance + * field or method; + * or the declaring class if accessing constructor; + * or null if accessing static field or method + * @param modifiers the member's access modifiers + * @return {@code true} if access to member is granted */ public static boolean verifyMemberAccess(Class currentClass, Class memberClass, Class targetClass, int modifiers) { - // Verify that currentClass can access a field, method, or - // constructor of memberClass, where that member's access bits are - // "modifiers". - - boolean gotIsSameClassPackage = false; - boolean isSameClassPackage = false; - if (currentClass == memberClass) { // Always succeeds return true; } - if (!verifyModuleAccess(currentClass, memberClass)) { + if (!verifyModuleAccess(currentClass.getModule(), memberClass)) { return false; } + boolean gotIsSameClassPackage = false; + boolean isSameClassPackage = false; + if (!Modifier.isPublic(getClassAccessFlags(memberClass))) { isSameClassPackage = isSameClassPackage(currentClass, memberClass); gotIsSameClassPackage = true; @@ -190,17 +195,16 @@ } /** - * Returns {@code true} if memberClass's's module exports memberClass's - * package to currentClass's module. + * Returns {@code true} if memberClass's module exports memberClass's + * package to currentModule. */ - public static boolean verifyModuleAccess(Class currentClass, Class memberClass) { - return verifyModuleAccess(currentClass.getModule(), memberClass); - } - public static boolean verifyModuleAccess(Module currentModule, Class memberClass) { Module memberModule = memberClass.getModule(); if (currentModule == memberModule) { - return true; // same module (named or unnamed) + // same module (named or unnamed) or both null if called + // before module system is initialized, which means we are + // dealing with java.base only. + return true; } else { String pkg = memberClass.getPackageName(); return memberModule.isExported(pkg, currentModule); @@ -332,10 +336,11 @@ * Returns an IllegalAccessException with an exception message based on * the access that is denied. */ - public static IllegalAccessException newIllegalAccessException(Class currentClass, - Class memberClass, - Object target, - int modifiers) + public static IllegalAccessException newIllegalAccessException( + Class currentClass, + Class memberClass, + Class targetClass, + int modifiers) throws IllegalAccessException { String currentSuffix = "";