< prev index next >

src/java.base/share/classes/java/lang/reflect/AccessibleObject.java

Print this page




 267     }
 268 
 269 
 270    /**
 271     * If the given AccessibleObject is a {@code Constructor}, {@code Method}
 272     * or {@code Field} then checks that its declaring class is in a package
 273     * that can be accessed by the given caller of setAccessible.
 274     */
 275     void checkCanSetAccessible(Class<?> caller) {
 276         // do nothing, needs to be overridden by Constructor, Method, Field
 277     }
 278 
 279 
 280     void checkCanSetAccessible(Class<?> caller, Class<?> declaringClass) {
 281         checkCanSetAccessible(caller, declaringClass, true);
 282     }
 283 
 284     private boolean checkCanSetAccessible(Class<?> caller,
 285                                           Class<?> declaringClass,
 286                                           boolean throwExceptionIfDenied) {
 287         Module callerModule = caller.getModule();
 288         Module declaringModule = declaringClass.getModule();
 289 
 290         if (callerModule == declaringModule) return true;
 291         if (callerModule == Object.class.getModule()) return true;
 292         if (!declaringModule.isNamed()) return true;
 293 
 294         String pn = declaringClass.getPackageName();
 295         int modifiers;
 296         if (this instanceof Executable) {
 297             modifiers = ((Executable) this).getModifiers();
 298         } else {
 299             modifiers = ((Field) this).getModifiers();
 300         }
 301 














 302         // class is public and package is exported to caller
 303         boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers());

 304         if (isClassPublic && declaringModule.isExported(pn, callerModule)) {
 305             // member is public
 306             if (Modifier.isPublic(modifiers)) {
 307                 logIfExportedForIllegalAccess(caller, declaringClass);
 308                 return true;
 309             }
 310 
 311             // member is protected-static
 312             if (Modifier.isProtected(modifiers)
 313                 && Modifier.isStatic(modifiers)
 314                 && isSubclassOf(caller, declaringClass)) {
 315                 logIfExportedForIllegalAccess(caller, declaringClass);
 316                 return true;
 317             }
 318         }
 319 
 320         // package is open to caller
 321         if (declaringModule.isOpen(pn, callerModule)) {
 322             logIfOpenedForIllegalAccess(caller, declaringClass);
 323             return true;




 267     }
 268 
 269 
 270    /**
 271     * If the given AccessibleObject is a {@code Constructor}, {@code Method}
 272     * or {@code Field} then checks that its declaring class is in a package
 273     * that can be accessed by the given caller of setAccessible.
 274     */
 275     void checkCanSetAccessible(Class<?> caller) {
 276         // do nothing, needs to be overridden by Constructor, Method, Field
 277     }
 278 
 279 
 280     void checkCanSetAccessible(Class<?> caller, Class<?> declaringClass) {
 281         checkCanSetAccessible(caller, declaringClass, true);
 282     }
 283 
 284     private boolean checkCanSetAccessible(Class<?> caller,
 285                                           Class<?> declaringClass,
 286                                           boolean throwExceptionIfDenied) {








 287         int modifiers;
 288         if (this instanceof Executable) {
 289             modifiers = ((Executable) this).getModifiers();
 290         } else {
 291             modifiers = ((Field) this).getModifiers();
 292         }
 293 
 294         // does not allow to suppress access check for Value class's
 295         // constructor or field
 296         if (declaringClass.isValue()) {
 297             if (this instanceof Constructor) return false;
 298             if (this instanceof Field && Modifier.isFinal(modifiers)) return false;
 299         }
 300 
 301         Module callerModule = caller.getModule();
 302         Module declaringModule = declaringClass.getModule();
 303 
 304         if (callerModule == declaringModule) return true;
 305         if (callerModule == Object.class.getModule()) return true;
 306         if (!declaringModule.isNamed()) return true;
 307 
 308         // class is public and package is exported to caller
 309         boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers());
 310         String pn = declaringClass.getPackageName();
 311         if (isClassPublic && declaringModule.isExported(pn, callerModule)) {
 312             // member is public
 313             if (Modifier.isPublic(modifiers)) {
 314                 logIfExportedForIllegalAccess(caller, declaringClass);
 315                 return true;
 316             }
 317 
 318             // member is protected-static
 319             if (Modifier.isProtected(modifiers)
 320                 && Modifier.isStatic(modifiers)
 321                 && isSubclassOf(caller, declaringClass)) {
 322                 logIfExportedForIllegalAccess(caller, declaringClass);
 323                 return true;
 324             }
 325         }
 326 
 327         // package is open to caller
 328         if (declaringModule.isOpen(pn, callerModule)) {
 329             logIfOpenedForIllegalAccess(caller, declaringClass);
 330             return true;


< prev index next >