< prev index next >
src/java.base/share/classes/jdk/internal/reflect/Reflection.java
Print this page
*** 82,112 ****
valid. */
@HotSpotIntrinsicCandidate
public static native int getClassAccessFlags(Class<?> c);
public static void ensureMemberAccess(Class<?> currentClass,
Class<?> memberClass,
! Object target,
int modifiers)
throws IllegalAccessException
{
if (currentClass == null || memberClass == null) {
throw new InternalError();
}
! if (!verifyMemberAccess(currentClass, memberClass, target, modifiers)) {
! throwIllegalAccessException(currentClass, memberClass, target, modifiers);
}
}
! public static boolean verifyMemberAccess(Class<?> currentClass,
! // Declaring class of field
! // or method
Class<?> memberClass,
! // May be NULL in case of statics
! Object target,
int modifiers)
{
// Verify that currentClass can access a field, method, or
// constructor of memberClass, where that member's access bits are
// "modifiers".
--- 82,122 ----
valid. */
@HotSpotIntrinsicCandidate
public static native int getClassAccessFlags(Class<?> c);
+ /**
+ * Ensures that access to a member is granted and throws
+ * IllegalAccessException if not.
+ *
+ * @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
+ * @throws IllegalAccessException if access to member is denied
+ */
public static void ensureMemberAccess(Class<?> currentClass,
Class<?> memberClass,
! Class<?> targetClass,
int modifiers)
throws IllegalAccessException
{
if (currentClass == null || memberClass == null) {
throw new InternalError();
}
! if (!verifyMemberAccess(currentClass, memberClass, targetClass, modifiers)) {
! throwIllegalAccessException(currentClass, memberClass, targetClass, modifiers);
}
}
! private 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".
*** 160,184 ****
if (!successSoFar) {
return false;
}
! if (Modifier.isProtected(modifiers)) {
! // Additional test for protected members: JLS 6.6.2
! Class<?> targetClass = (target == null ? memberClass : target.getClass());
! if (targetClass != currentClass) {
if (!gotIsSameClassPackage) {
isSameClassPackage = isSameClassPackage(currentClass, memberClass);
gotIsSameClassPackage = true;
}
if (!isSameClassPackage) {
if (!isSubclassOf(targetClass, currentClass)) {
return false;
}
}
}
- }
return true;
}
/**
--- 170,194 ----
if (!successSoFar) {
return false;
}
! // Additional test for protected instance members
! // and protected constructors: JLS 6.6.2
! if (targetClass != null && Modifier.isProtected(modifiers) &&
! targetClass != currentClass)
! {
if (!gotIsSameClassPackage) {
isSameClassPackage = isSameClassPackage(currentClass, memberClass);
gotIsSameClassPackage = true;
}
if (!isSameClassPackage) {
if (!isSubclassOf(targetClass, currentClass)) {
return false;
}
}
}
return true;
}
/**
< prev index next >