334 * @param class1 a class
335 * @param class2 another class
336 * @return whether they are in the same package
337 */
338 public static boolean isSamePackage(Class<?> class1, Class<?> class2) {
339 assert(!class1.isArray() && !class2.isArray());
340 if (class1 == class2)
341 return true;
342 if (class1.getClassLoader() != class2.getClassLoader())
343 return false;
344 return Objects.equals(class1.getPackageName(), class2.getPackageName());
345 }
346
347 /**
348 * Test if two classes are defined as part of the same package member (top-level class).
349 * If this is true, they can share private access with each other.
350 * @param class1 a class
351 * @param class2 another class
352 * @return whether they are identical or nested together
353 */
354 public static boolean areNestMates(Class<?> class1, Class<?> class2) {
355 if (class1 == class2)
356 return true;
357 if (!isSamePackage(class1, class2))
358 return false;
359 if (Reflection.areNestMates(class1, class2))
360 return true;
361 // Could be pre-nestmate nested types
362 if (getOutermostEnclosingClass(class1) != getOutermostEnclosingClass(class2))
363 return false;
364 return true;
365 }
366
367 private static Class<?> getOutermostEnclosingClass(Class<?> c) {
368 Class<?> pkgmem = c;
369 for (Class<?> enc = c; (enc = enc.getEnclosingClass()) != null; )
370 pkgmem = enc;
371 return pkgmem;
372 }
373
374 private static boolean loadersAreRelated(ClassLoader loader1, ClassLoader loader2,
375 boolean loader1MustBeParent) {
376 if (loader1 == loader2 || loader1 == null
377 || (loader2 == null && !loader1MustBeParent)) {
378 return true;
379 }
380 for (ClassLoader scan2 = loader2;
381 scan2 != null; scan2 = scan2.getParent()) {
|
334 * @param class1 a class
335 * @param class2 another class
336 * @return whether they are in the same package
337 */
338 public static boolean isSamePackage(Class<?> class1, Class<?> class2) {
339 assert(!class1.isArray() && !class2.isArray());
340 if (class1 == class2)
341 return true;
342 if (class1.getClassLoader() != class2.getClassLoader())
343 return false;
344 return Objects.equals(class1.getPackageName(), class2.getPackageName());
345 }
346
347 /**
348 * Test if two classes are defined as part of the same package member (top-level class).
349 * If this is true, they can share private access with each other.
350 * @param class1 a class
351 * @param class2 another class
352 * @return whether they are identical or nested together
353 */
354 public static boolean isSamePackageMember(Class<?> class1, Class<?> class2) {
355 if (class1 == class2)
356 return true;
357 if (!isSamePackage(class1, class2))
358 return false;
359 if (getOutermostEnclosingClass(class1) != getOutermostEnclosingClass(class2))
360 return false;
361 return true;
362 }
363
364 private static Class<?> getOutermostEnclosingClass(Class<?> c) {
365 Class<?> pkgmem = c;
366 for (Class<?> enc = c; (enc = enc.getEnclosingClass()) != null; )
367 pkgmem = enc;
368 return pkgmem;
369 }
370
371 private static boolean loadersAreRelated(ClassLoader loader1, ClassLoader loader2,
372 boolean loader1MustBeParent) {
373 if (loader1 == loader2 || loader1 == null
374 || (loader2 == null && !loader1MustBeParent)) {
375 return true;
376 }
377 for (ClassLoader scan2 = loader2;
378 scan2 != null; scan2 = scan2.getParent()) {
|