< prev index next >
src/java.base/share/classes/java/lang/reflect/AccessibleObject.java
Print this page
*** 26,38 ****
--- 26,40 ----
package java.lang.reflect;
import java.lang.annotation.Annotation;
import java.security.AccessController;
+ import jdk.internal.misc.VM;
import jdk.internal.reflect.CallerSensitive;
import jdk.internal.reflect.Reflection;
import jdk.internal.reflect.ReflectionFactory;
+ import sun.security.action.GetPropertyAction;
/**
* The AccessibleObject class is the base class for Field, Method and
* Constructor objects. It provides the ability to flag a reflected
* object as suppressing default Java language access control checks
*** 170,181 ****
if (callerModule == Object.class.getModule()) return;
if (!declaringModule.isNamed()) return;
// package is open to caller
String pn = packageName(declaringClass);
! if (declaringModule.isOpen(pn, callerModule))
return;
// package is exported to caller and class/member is public
boolean isExported = declaringModule.isExported(pn, callerModule);
boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers());
int modifiers;
--- 172,185 ----
if (callerModule == Object.class.getModule()) return;
if (!declaringModule.isNamed()) return;
// package is open to caller
String pn = packageName(declaringClass);
! if (declaringModule.isOpen(pn, callerModule)) {
! printStackTraceIfOpenedReflectively(declaringModule, pn, callerModule);
return;
+ }
// package is exported to caller and class/member is public
boolean isExported = declaringModule.isExported(pn, callerModule);
boolean isClassPublic = Modifier.isPublic(declaringClass.getModifiers());
int modifiers;
*** 183,194 ****
modifiers = ((Executable) this).getModifiers();
} else {
modifiers = ((Field) this).getModifiers();
}
boolean isMemberPublic = Modifier.isPublic(modifiers);
! if (isExported && isClassPublic && isMemberPublic)
return;
// not accessible
String msg = "Unable to make ";
if (this instanceof Field)
msg += "field ";
--- 187,200 ----
modifiers = ((Executable) this).getModifiers();
} else {
modifiers = ((Field) this).getModifiers();
}
boolean isMemberPublic = Modifier.isPublic(modifiers);
! if (isExported && isClassPublic && isMemberPublic) {
! printStackTraceIfExportedReflectively(declaringModule, pn, callerModule);
return;
+ }
// not accessible
String msg = "Unable to make ";
if (this instanceof Field)
msg += "field ";
*** 196,206 ****
if (isClassPublic && isMemberPublic)
msg += "exports";
else
msg += "opens";
msg += " " + pn + "\" to " + callerModule;
! Reflection.throwInaccessibleObjectException(msg);
}
/**
* Returns the package name of the given class.
*/
--- 202,256 ----
if (isClassPublic && isMemberPublic)
msg += "exports";
else
msg += "opens";
msg += " " + pn + "\" to " + callerModule;
! InaccessibleObjectException e = new InaccessibleObjectException(msg);
! if (Reflection.printStackTraceWhenAccessFails()) {
! e.printStackTrace(System.err);
! }
! throw e;
! }
!
! private void printStackTraceIfOpenedReflectively(Module module,
! String pn,
! Module other) {
! printStackTraceIfExposedReflectively(module, pn, other, true);
! }
!
! private void printStackTraceIfExportedReflectively(Module module,
! String pn,
! Module other) {
! printStackTraceIfExposedReflectively(module, pn, other, false);
! }
!
! private static class WARNING extends Exception {
!
! private static final long serialVersionUID = 42L;
!
! private WARNING(String msg) {
! super(msg);
! }
!
! public String toString() {
! return "WARNING: " + getMessage();
! }
!
! }
!
! private void printStackTraceIfExposedReflectively(Module module,
! String pn,
! Module other,
! boolean open) {
! if (Reflection.printStackTraceWhenAccessSucceeds()
! && !module.isStaticallyExportedOrOpen(pn, other, open)) {
! String msg = other + " allowed to invoke setAccessible on ";
! if (this instanceof Field)
! msg += "field ";
! msg += this;
! new WARNING(msg).printStackTrace(System.err);
! }
}
/**
* Returns the package name of the given class.
*/
< prev index next >