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; |