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