< prev index next >

src/java.base/share/classes/sun/invoke/util/VerifyAccess.java

Print this page




 118             if ((allowedModes & PROTECTED) == 0)
 119                 return false;
 120             // Protected members are accessible by subclasses, which does not include interfaces.
 121             // Interfaces are types, not classes. They should not have access to
 122             // protected members in j.l.Object, even though it is their superclass.
 123             if ((mods & STATIC) != 0 &&
 124                 !isRelatedClass(refc, lookupClass))
 125                 return false;
 126             if ((allowedModes & PROTECTED) != 0 &&
 127                 isSubClass(lookupClass, defc))
 128                 return true;
 129             return false;
 130         case PACKAGE_ONLY:  // That is, zero.  Unmarked member is package-only access.
 131             assert !defc.isInterface(); // package-private members aren't allowed in interfaces
 132             return ((allowedModes & PACKAGE_ALLOWED) != 0 &&
 133                     isSamePackage(defc, lookupClass));
 134         case PRIVATE:
 135             // Rules for privates follows access rules for nestmates.
 136             boolean canAccess = ((allowedModes & PRIVATE) != 0 &&
 137                                  Reflection.areNestMates(defc, lookupClass));
 138             // FIX ME: Sanity check refc == defc. Either remove or convert to
 139             // plain assert before integration.
 140             myassert((canAccess && refc == defc) || !canAccess);
 141             return canAccess;
 142         default:
 143             throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods));
 144         }
 145     }
 146     static void myassert(boolean cond) {
 147         if (!cond) throw new Error("Assertion failed");
 148     }
 149 
 150     static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
 151         return (refc == lookupClass ||
 152                 isSubClass(refc, lookupClass) ||
 153                 isSubClass(lookupClass, refc));
 154     }
 155 
 156     static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {
 157         return defc.isAssignableFrom(lookupClass) &&
 158                !lookupClass.isInterface(); // interfaces are types, not classes.
 159     }
 160 
 161     static int getClassModifiers(Class<?> c) {
 162         // This would return the mask stored by javac for the source-level modifiers.
 163         //   return c.getModifiers();
 164         // But what we need for JVM access checks are the actual bits from the class header.
 165         // ...But arrays and primitives are synthesized with their own odd flags:
 166         if (c.isArray() || c.isPrimitive())
 167             return c.getModifiers();




 118             if ((allowedModes & PROTECTED) == 0)
 119                 return false;
 120             // Protected members are accessible by subclasses, which does not include interfaces.
 121             // Interfaces are types, not classes. They should not have access to
 122             // protected members in j.l.Object, even though it is their superclass.
 123             if ((mods & STATIC) != 0 &&
 124                 !isRelatedClass(refc, lookupClass))
 125                 return false;
 126             if ((allowedModes & PROTECTED) != 0 &&
 127                 isSubClass(lookupClass, defc))
 128                 return true;
 129             return false;
 130         case PACKAGE_ONLY:  // That is, zero.  Unmarked member is package-only access.
 131             assert !defc.isInterface(); // package-private members aren't allowed in interfaces
 132             return ((allowedModes & PACKAGE_ALLOWED) != 0 &&
 133                     isSamePackage(defc, lookupClass));
 134         case PRIVATE:
 135             // Rules for privates follows access rules for nestmates.
 136             boolean canAccess = ((allowedModes & PRIVATE) != 0 &&
 137                                  Reflection.areNestMates(defc, lookupClass));
 138             // for private methods the selected method equals the
 139             // resolved method - so refc == defc
 140             assert (canAccess && refc == defc) || !canAccess;
 141             return canAccess;
 142         default:
 143             throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods));
 144         }



 145     }
 146 
 147     static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) {
 148         return (refc == lookupClass ||
 149                 isSubClass(refc, lookupClass) ||
 150                 isSubClass(lookupClass, refc));
 151     }
 152 
 153     static boolean isSubClass(Class<?> lookupClass, Class<?> defc) {
 154         return defc.isAssignableFrom(lookupClass) &&
 155                !lookupClass.isInterface(); // interfaces are types, not classes.
 156     }
 157 
 158     static int getClassModifiers(Class<?> c) {
 159         // This would return the mask stored by javac for the source-level modifiers.
 160         //   return c.getModifiers();
 161         // But what we need for JVM access checks are the actual bits from the class header.
 162         // ...But arrays and primitives are synthesized with their own odd flags:
 163         if (c.isArray() || c.isPrimitive())
 164             return c.getModifiers();


< prev index next >