< prev index next >

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

Print this page

184      * @param prevLookupClass the class from which the lookup was teleported or null
185      * @param allowedModes allowed modes
186      */
187     public static boolean isClassAccessible(Class<?> refc,
188                                             Class<?> lookupClass,
189                                             Class<?> prevLookupClass,
190                                             int allowedModes) {
191         if (allowedModes == 0)  return false;
192         assert((allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED|UNCONDITIONAL_ALLOWED|ORIGINAL_ALLOWED)) == 0);
193 
194         if ((allowedModes & PACKAGE_ALLOWED) != 0 &&
195             isSamePackage(lookupClass, refc))
196             return true;
197 
198         int mods = getClassModifiers(refc);
199         if (isPublic(mods)) {
200 
201             Module lookupModule = lookupClass.getModule();
202             Module refModule = refc.getModule();
203 
204             // early VM startup case, java.base not defined
205             if (lookupModule == null) {
206                 assert refModule == null;

207                 return true;
208             }
209 
210             // allow access to public types in all unconditionally exported packages
211             if ((allowedModes & UNCONDITIONAL_ALLOWED) != 0) {
212                 return refModule.isExported(refc.getPackageName());
213             }
214 
215             if (lookupModule == refModule && prevLookupClass == null) {
216                 // allow access to all public types in lookupModule
217                 if ((allowedModes & MODULE_ALLOWED) != 0)
218                     return true;
219 
220                 assert (allowedModes & PUBLIC) != 0;
221                 return refModule.isExported(refc.getPackageName());
222             }
223 
224             // cross-module access
225             // 1. refc is in different module from lookupModule, or
226             // 2. refc is in lookupModule and a different module from prevLookupModule
227             Module prevLookupModule = prevLookupClass != null ? prevLookupClass.getModule()
228                                                               : null;
229             assert refModule != lookupModule || refModule != prevLookupModule;
230             if (isModuleAccessible(refc, lookupModule, prevLookupModule))
231                 return true;
232 
233             // not exported but allow access during VM initialization
234             // because java.base does not have its exports setup
235             if (!jdk.internal.misc.VM.isModuleSystemInited())
236                 return true;
237 
238             // public class not accessible to lookupClass
239             return false;
240         }
241 
242         return false;
243     }
244 
245     /*
246      * Tests if a class or interface REFC is accessible to m1 and m2 where m2
247      * may be null.
248      *
249      * A class or interface REFC in m is accessible to m1 and m2 if and only if
250      * both m1 and m2 read m and m exports the package of REFC at least to
251      * both m1 and m2.
252      */
253     public static boolean isModuleAccessible(Class<?> refc,  Module m1, Module m2) {
254         Module refModule = refc.getModule();
255         assert refModule != m1 || refModule != m2;

184      * @param prevLookupClass the class from which the lookup was teleported or null
185      * @param allowedModes allowed modes
186      */
187     public static boolean isClassAccessible(Class<?> refc,
188                                             Class<?> lookupClass,
189                                             Class<?> prevLookupClass,
190                                             int allowedModes) {
191         if (allowedModes == 0)  return false;
192         assert((allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED|UNCONDITIONAL_ALLOWED|ORIGINAL_ALLOWED)) == 0);
193 
194         if ((allowedModes & PACKAGE_ALLOWED) != 0 &&
195             isSamePackage(lookupClass, refc))
196             return true;
197 
198         int mods = getClassModifiers(refc);
199         if (isPublic(mods)) {
200 
201             Module lookupModule = lookupClass.getModule();
202             Module refModule = refc.getModule();
203 
204             // early VM startup case, java.base not defined or
205             // module system is not fully initialized and exports are not set up
206             if (lookupModule == null || !jdk.internal.misc.VM.isModuleSystemInited()) {
207                 assert lookupModule == refModule;
208                 return true;
209             }
210 
211             // allow access to public types in all unconditionally exported packages
212             if ((allowedModes & UNCONDITIONAL_ALLOWED) != 0) {
213                 return refModule.isExported(refc.getPackageName());
214             }
215 
216             if (lookupModule == refModule && prevLookupClass == null) {
217                 // allow access to all public types in lookupModule
218                 if ((allowedModes & MODULE_ALLOWED) != 0)
219                     return true;
220 
221                 assert (allowedModes & PUBLIC) != 0;
222                 return refModule.isExported(refc.getPackageName());
223             }
224 
225             // cross-module access
226             // 1. refc is in different module from lookupModule, or
227             // 2. refc is in lookupModule and a different module from prevLookupModule
228             Module prevLookupModule = prevLookupClass != null ? prevLookupClass.getModule()
229                                                               : null;
230             assert refModule != lookupModule || refModule != prevLookupModule;


231 
232             if (isModuleAccessible(refc, lookupModule, prevLookupModule))


233                 return true;
234 
235             // public class not accessible to lookupClass
236             return false;
237         }
238 
239         return false;
240     }
241 
242     /*
243      * Tests if a class or interface REFC is accessible to m1 and m2 where m2
244      * may be null.
245      *
246      * A class or interface REFC in m is accessible to m1 and m2 if and only if
247      * both m1 and m2 read m and m exports the package of REFC at least to
248      * both m1 and m2.
249      */
250     public static boolean isModuleAccessible(Class<?> refc,  Module m1, Module m2) {
251         Module refModule = refc.getModule();
252         assert refModule != m1 || refModule != m2;
< prev index next >