< prev index next >

src/java.base/share/classes/jdk/internal/reflect/Reflection.java

Print this page




  67     /**
  68      * @deprecated This method will be removed.
  69      * This method is a private JDK API and retained temporarily to
  70      * simplify the implementation of sun.misc.Reflection.getCallerClass.
  71      */
  72     @Deprecated(forRemoval=true)
  73     public static native Class<?> getCallerClass(int depth);
  74 
  75     /** Retrieves the access flags written to the class file. For
  76         inner classes these flags may differ from those returned by
  77         Class.getModifiers(), which searches the InnerClasses
  78         attribute to find the source-level access flags. This is used
  79         instead of Class.getModifiers() for run-time access checks due
  80         to compatibility reasons; see 4471811. Only the values of the
  81         low 13 bits (i.e., a mask of 0x1FFF) are guaranteed to be
  82         valid. */
  83     @HotSpotIntrinsicCandidate
  84     public static native int getClassAccessFlags(Class<?> c);
  85 
  86 













  87     public static void ensureMemberAccess(Class<?> currentClass,
  88                                           Class<?> memberClass,
  89                                           Object target,
  90                                           int modifiers)
  91         throws IllegalAccessException
  92     {
  93         if (currentClass == null || memberClass == null) {
  94             throw new InternalError();
  95         }
  96 
  97         if (!verifyMemberAccess(currentClass, memberClass, target, modifiers)) {
  98             throwIllegalAccessException(currentClass, memberClass, target, modifiers);
  99         }
 100     }
 101 
 102     public static boolean verifyMemberAccess(Class<?> currentClass,
 103                                              // Declaring class of field
 104                                              // or method
 105                                              Class<?> memberClass,
 106                                              // May be NULL in case of statics
 107                                              Object   target,
 108                                              int      modifiers)
 109     {
 110         // Verify that currentClass can access a field, method, or
 111         // constructor of memberClass, where that member's access bits are
 112         // "modifiers".
 113 
 114         boolean gotIsSameClassPackage = false;
 115         boolean isSameClassPackage = false;
 116 
 117         if (currentClass == memberClass) {
 118             // Always succeeds
 119             return true;
 120         }
 121 
 122         if (!verifyModuleAccess(currentClass, memberClass)) {
 123             return false;
 124         }
 125 
 126         if (!Modifier.isPublic(getClassAccessFlags(memberClass))) {
 127             isSameClassPackage = isSameClassPackage(currentClass, memberClass);


 145                 successSoFar = true;
 146             }
 147         }
 148 
 149         if (!successSoFar && !Modifier.isPrivate(modifiers)) {
 150             if (!gotIsSameClassPackage) {
 151                 isSameClassPackage = isSameClassPackage(currentClass,
 152                                                         memberClass);
 153                 gotIsSameClassPackage = true;
 154             }
 155 
 156             if (isSameClassPackage) {
 157                 successSoFar = true;
 158             }
 159         }
 160 
 161         if (!successSoFar) {
 162             return false;
 163         }
 164 
 165         if (Modifier.isProtected(modifiers)) {
 166             // Additional test for protected members: JLS 6.6.2
 167             Class<?> targetClass = (target == null ? memberClass : target.getClass());
 168             if (targetClass != currentClass) {

 169                 if (!gotIsSameClassPackage) {
 170                     isSameClassPackage = isSameClassPackage(currentClass, memberClass);
 171                     gotIsSameClassPackage = true;
 172                 }
 173                 if (!isSameClassPackage) {
 174                     if (!isSubclassOf(targetClass, currentClass)) {
 175                         return false;
 176                     }
 177                 }
 178             }
 179         }
 180 
 181         return true;
 182     }
 183 
 184     /**
 185      * Returns {@code true} if memberClass's's module exports memberClass's
 186      * package to currentClass's module.
 187      */
 188     public static boolean verifyModuleAccess(Class<?> currentClass,
 189                                              Class<?> memberClass) {
 190         return verifyModuleAccess(currentClass.getModule(), memberClass);
 191     }
 192 
 193     public static boolean verifyModuleAccess(Module currentModule, Class<?> memberClass) {
 194         Module memberModule = memberClass.getModule();
 195 
 196         // module may be null during startup (initLevel 0)




  67     /**
  68      * @deprecated This method will be removed.
  69      * This method is a private JDK API and retained temporarily to
  70      * simplify the implementation of sun.misc.Reflection.getCallerClass.
  71      */
  72     @Deprecated(forRemoval=true)
  73     public static native Class<?> getCallerClass(int depth);
  74 
  75     /** Retrieves the access flags written to the class file. For
  76         inner classes these flags may differ from those returned by
  77         Class.getModifiers(), which searches the InnerClasses
  78         attribute to find the source-level access flags. This is used
  79         instead of Class.getModifiers() for run-time access checks due
  80         to compatibility reasons; see 4471811. Only the values of the
  81         low 13 bits (i.e., a mask of 0x1FFF) are guaranteed to be
  82         valid. */
  83     @HotSpotIntrinsicCandidate
  84     public static native int getClassAccessFlags(Class<?> c);
  85 
  86 
  87     /**
  88      * Ensures that access to a member is granted and throws
  89      * IllegalAccessException if not.
  90      *
  91      * @param currentClass the class performing the access
  92      * @param memberClass the declaring class of the member being accessed
  93      * @param targetClass the class of target object if accessing instance
  94      *                    field or method;
  95      *                    or the declaring class if accessing constructor;
  96      *                    or null if accessing static field or method
  97      * @param modifiers the member's access modifiers
  98      * @throws IllegalAccessException if access to member is denied
  99      */
 100     public static void ensureMemberAccess(Class<?> currentClass,
 101                                           Class<?> memberClass,
 102                                           Class<?> targetClass,
 103                                           int modifiers)
 104         throws IllegalAccessException
 105     {
 106         if (currentClass == null || memberClass == null) {
 107             throw new InternalError();
 108         }
 109 
 110         if (!verifyMemberAccess(currentClass, memberClass, targetClass, modifiers)) {
 111             throwIllegalAccessException(currentClass, memberClass, targetClass, modifiers);
 112         }
 113     }
 114 
 115     private static boolean verifyMemberAccess(Class<?> currentClass,


 116                                               Class<?> memberClass,
 117                                               Class<?> targetClass,

 118                                               int modifiers)
 119     {
 120         // Verify that currentClass can access a field, method, or
 121         // constructor of memberClass, where that member's access bits are
 122         // "modifiers".
 123 
 124         boolean gotIsSameClassPackage = false;
 125         boolean isSameClassPackage = false;
 126 
 127         if (currentClass == memberClass) {
 128             // Always succeeds
 129             return true;
 130         }
 131 
 132         if (!verifyModuleAccess(currentClass, memberClass)) {
 133             return false;
 134         }
 135 
 136         if (!Modifier.isPublic(getClassAccessFlags(memberClass))) {
 137             isSameClassPackage = isSameClassPackage(currentClass, memberClass);


 155                 successSoFar = true;
 156             }
 157         }
 158 
 159         if (!successSoFar && !Modifier.isPrivate(modifiers)) {
 160             if (!gotIsSameClassPackage) {
 161                 isSameClassPackage = isSameClassPackage(currentClass,
 162                                                         memberClass);
 163                 gotIsSameClassPackage = true;
 164             }
 165 
 166             if (isSameClassPackage) {
 167                 successSoFar = true;
 168             }
 169         }
 170 
 171         if (!successSoFar) {
 172             return false;
 173         }
 174 
 175         // Additional test for protected instance members
 176         // and protected constructors: JLS 6.6.2
 177         if (targetClass != null && Modifier.isProtected(modifiers) &&
 178             targetClass != currentClass)
 179         {
 180             if (!gotIsSameClassPackage) {
 181                 isSameClassPackage = isSameClassPackage(currentClass, memberClass);
 182                 gotIsSameClassPackage = true;
 183             }
 184             if (!isSameClassPackage) {
 185                 if (!isSubclassOf(targetClass, currentClass)) {
 186                     return false;

 187                 }
 188             }
 189         }
 190 
 191         return true;
 192     }
 193 
 194     /**
 195      * Returns {@code true} if memberClass's's module exports memberClass's
 196      * package to currentClass's module.
 197      */
 198     public static boolean verifyModuleAccess(Class<?> currentClass,
 199                                              Class<?> memberClass) {
 200         return verifyModuleAccess(currentClass.getModule(), memberClass);
 201     }
 202 
 203     public static boolean verifyModuleAccess(Module currentModule, Class<?> memberClass) {
 204         Module memberModule = memberClass.getModule();
 205 
 206         // module may be null during startup (initLevel 0)


< prev index next >