author | drchase |
Wed, 16 Oct 2013 17:55:49 -0400 | |
changeset 20872 | 8e486b70dff8 |
parent 20535 | cc85c8626435 |
child 23022 | ede1afdc49a2 |
permissions | -rw-r--r-- |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
1 |
/* |
20872
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
2 |
* Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved. |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
4 |
* |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
5506 | 7 |
* published by the Free Software Foundation. Oracle designates this |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
5506 | 9 |
* by Oracle in the LICENSE file that accompanied this code. |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
10 |
* |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
15 |
* accompanied this code). |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
16 |
* |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
20 |
* |
5506 | 21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
22 |
* or visit www.oracle.com if you need additional information or have any |
|
23 |
* questions. |
|
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
24 |
*/ |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
25 |
|
8822
8145ab9f5f86
7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents:
8821
diff
changeset
|
26 |
package sun.invoke.util; |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
27 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
28 |
import java.lang.reflect.Modifier; |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
29 |
import static java.lang.reflect.Modifier.*; |
20872
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
30 |
import sun.reflect.Reflection; |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
31 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
32 |
/** |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
33 |
* This class centralizes information about the JVM's linkage access control. |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
34 |
* @author jrose |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
35 |
*/ |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
36 |
public class VerifyAccess { |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
37 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
38 |
private VerifyAccess() { } // cannot instantiate |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
39 |
|
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
40 |
private static final int PACKAGE_ONLY = 0; |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
41 |
private static final int PACKAGE_ALLOWED = java.lang.invoke.MethodHandles.Lookup.PACKAGE; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
42 |
private static final int PROTECTED_OR_PACKAGE_ALLOWED = (PACKAGE_ALLOWED|PROTECTED); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
43 |
private static final int ALL_ACCESS_MODES = (PUBLIC|PRIVATE|PROTECTED|PACKAGE_ONLY); |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
5725
diff
changeset
|
44 |
private static final boolean ALLOW_NESTMATE_ACCESS = false; |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
45 |
|
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
46 |
/** |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
47 |
* Evaluate the JVM linkage rules for access to the given method |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
48 |
* on behalf of a caller class which proposes to perform the access. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
49 |
* Return true if the caller class has privileges to invoke a method |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
50 |
* or access a field with the given properties. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
51 |
* This requires an accessibility check of the referencing class, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
52 |
* plus an accessibility check of the member within the class, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
53 |
* which depends on the member's modifier flags. |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
54 |
* <p> |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
55 |
* The relevant properties include the defining class ({@code defc}) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
56 |
* of the member, and its modifier flags ({@code mods}). |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
57 |
* Also relevant is the class used to make the initial symbolic reference |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
58 |
* to the member ({@code refc}). If this latter class is not distinguished, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
59 |
* the defining class should be passed for both arguments ({@code defc == refc}). |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
60 |
* <h3>JVM Specification, 5.4.4 "Access Control"</h3> |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
61 |
* A field or method R is accessible to a class or interface D if |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
62 |
* and only if any of the following conditions is true:<ul> |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
63 |
* <li>R is public. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
64 |
* <li>R is protected and is declared in a class C, and D is either |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
65 |
* a subclass of C or C itself. Furthermore, if R is not |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
66 |
* static, then the symbolic reference to R must contain a |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
67 |
* symbolic reference to a class T, such that T is either a |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
68 |
* subclass of D, a superclass of D or D itself. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
69 |
* <li>R is either protected or has default access (that is, |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
70 |
* neither public nor protected nor private), and is declared |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
71 |
* by a class in the same runtime package as D. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
72 |
* <li>R is private and is declared in D. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
73 |
* </ul> |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
74 |
* This discussion of access control omits a related restriction |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
75 |
* on the target of a protected field access or method invocation |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
76 |
* (the target must be of class D or a subtype of D). That |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
77 |
* requirement is checked as part of the verification process |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
78 |
* (5.4.1); it is not part of link-time access control. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
79 |
* @param refc the class used in the symbolic reference to the proposed member |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
80 |
* @param defc the class in which the proposed member is actually defined |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
81 |
* @param mods modifier flags for the proposed member |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
82 |
* @param lookupClass the class for which the access check is being made |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
83 |
* @return true iff the the accessing class can access such a member |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
84 |
*/ |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
85 |
public static boolean isMemberAccessible(Class<?> refc, // symbolic ref class |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
86 |
Class<?> defc, // actual def class |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
87 |
int mods, // actual member mods |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
88 |
Class<?> lookupClass, |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
89 |
int allowedModes) { |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
90 |
if (allowedModes == 0) return false; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
91 |
assert((allowedModes & PUBLIC) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
92 |
(allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED)) == 0); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
93 |
// Usually refc and defc are the same, but if they differ, verify them both. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
94 |
if (refc != defc) { |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
95 |
if (!isClassAccessible(refc, lookupClass, allowedModes)) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
96 |
// Note that defc is verified in the switch below. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
97 |
return false; |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
98 |
} |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
99 |
if ((mods & (ALL_ACCESS_MODES|STATIC)) == (PROTECTED|STATIC) && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
100 |
(allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0) { |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
101 |
// Apply the special rules for refc here. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
102 |
if (!isRelatedClass(refc, lookupClass)) |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
103 |
return isSamePackage(defc, lookupClass); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
104 |
// If refc == defc, the call to isPublicSuperClass will do |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
105 |
// the whole job, since in that case refc (as defc) will be |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
106 |
// a superclass of the lookup class. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
107 |
} |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
108 |
} |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
109 |
if (defc == lookupClass && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
110 |
(allowedModes & PRIVATE) != 0) |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
5725
diff
changeset
|
111 |
return true; // easy check; all self-access is OK |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
112 |
switch (mods & ALL_ACCESS_MODES) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
113 |
case PUBLIC: |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
114 |
if (refc != defc) return true; // already checked above |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
115 |
return isClassAccessible(refc, lookupClass, allowedModes); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
116 |
case PROTECTED: |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
117 |
if ((allowedModes & PROTECTED_OR_PACKAGE_ALLOWED) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
118 |
isSamePackage(defc, lookupClass)) |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
119 |
return true; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
120 |
if ((allowedModes & PROTECTED) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
121 |
isPublicSuperClass(defc, lookupClass)) |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
122 |
return true; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
123 |
return false; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
124 |
case PACKAGE_ONLY: // That is, zero. Unmarked member is package-only access. |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
125 |
return ((allowedModes & PACKAGE_ALLOWED) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
126 |
isSamePackage(defc, lookupClass)); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
127 |
case PRIVATE: |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
128 |
// Loosened rules for privates follows access rules for inner classes. |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
5725
diff
changeset
|
129 |
return (ALLOW_NESTMATE_ACCESS && |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
130 |
(allowedModes & PRIVATE) != 0 && |
7555
a279ebc3b25c
6981777: implement JSR 292 EG adjustments from summer 2010
jrose
parents:
5725
diff
changeset
|
131 |
isSamePackageMember(defc, lookupClass)); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
132 |
default: |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
133 |
throw new IllegalArgumentException("bad modifiers: "+Modifier.toString(mods)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
134 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
135 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
136 |
|
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
137 |
static boolean isRelatedClass(Class<?> refc, Class<?> lookupClass) { |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
138 |
return (refc == lookupClass || |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
139 |
refc.isAssignableFrom(lookupClass) || |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
140 |
lookupClass.isAssignableFrom(refc)); |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
141 |
} |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
142 |
|
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
143 |
static boolean isPublicSuperClass(Class<?> defc, Class<?> lookupClass) { |
20872
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
144 |
return isPublic(getClassModifiers(defc)) && defc.isAssignableFrom(lookupClass); |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
145 |
} |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
146 |
|
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
147 |
static int getClassModifiers(Class<?> c) { |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
148 |
// This would return the mask stored by javac for the source-level modifiers. |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
149 |
// return c.getModifiers(); |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
150 |
// But what we need for JVM access checks are the actual bits from the class header. |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
151 |
// ...But arrays and primitives are synthesized with their own odd flags: |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
152 |
if (c.isArray() || c.isPrimitive()) |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
153 |
return c.getModifiers(); |
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
154 |
return Reflection.getClassAccessFlags(c); |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
155 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
156 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
157 |
/** |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
158 |
* Evaluate the JVM linkage rules for access to the given class on behalf of caller. |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
159 |
* <h3>JVM Specification, 5.4.4 "Access Control"</h3> |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
160 |
* A class or interface C is accessible to a class or interface D |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
161 |
* if and only if either of the following conditions are true:<ul> |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
162 |
* <li>C is public. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
163 |
* <li>C and D are members of the same runtime package. |
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
164 |
* </ul> |
8347
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
7668
diff
changeset
|
165 |
* @param refc the symbolic reference class to which access is being checked (C) |
e5daa5772ffd
7013730: JSR 292 reflective operations should report errors with standard exception types
jrose
parents:
7668
diff
changeset
|
166 |
* @param lookupClass the class performing the lookup (D) |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
167 |
*/ |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
168 |
public static boolean isClassAccessible(Class<?> refc, Class<?> lookupClass, |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
169 |
int allowedModes) { |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
170 |
if (allowedModes == 0) return false; |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
171 |
assert((allowedModes & PUBLIC) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
172 |
(allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED)) == 0); |
20872
8e486b70dff8
8022718: Runtime accessibility checking: protected class, if extended, should be accessible from another package
drchase
parents:
20535
diff
changeset
|
173 |
int mods = getClassModifiers(refc); |
5722
4ada807383c8
6939134: JSR 292 adjustments to method handle invocation
jrose
parents:
4537
diff
changeset
|
174 |
if (isPublic(mods)) |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
175 |
return true; |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
176 |
if ((allowedModes & PACKAGE_ALLOWED) != 0 && |
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
177 |
isSamePackage(lookupClass, refc)) |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
178 |
return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
179 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
180 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
181 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
182 |
/** |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
183 |
* Decide if the given method type, attributed to a member or symbolic |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
184 |
* reference of a given reference class, is really visible to that class. |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
185 |
* @param type the supposed type of a member or symbolic reference of refc |
20535
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
186 |
* @param refc the class attempting to make the reference |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
187 |
*/ |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
188 |
public static boolean isTypeVisible(Class<?> type, Class<?> refc) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
189 |
if (type == refc) return true; // easy check |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
190 |
while (type.isArray()) type = type.getComponentType(); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
191 |
if (type.isPrimitive() || type == Object.class) return true; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
192 |
ClassLoader parent = type.getClassLoader(); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
193 |
if (parent == null) return true; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
194 |
ClassLoader child = refc.getClassLoader(); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
195 |
if (child == null) return false; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
196 |
if (parent == child || loadersAreRelated(parent, child, true)) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
197 |
return true; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
198 |
// Do it the hard way: Look up the type name from the refc loader. |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
199 |
try { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
200 |
Class<?> res = child.loadClass(type.getName()); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
201 |
return (type == res); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
202 |
} catch (ClassNotFoundException ex) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
203 |
return false; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
204 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
205 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
206 |
|
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
207 |
/** |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
208 |
* Decide if the given method type, attributed to a member or symbolic |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
209 |
* reference of a given reference class, is really visible to that class. |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
210 |
* @param type the supposed type of a member or symbolic reference of refc |
20535
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
211 |
* @param refc the class attempting to make the reference |
13423
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
212 |
*/ |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
213 |
public static boolean isTypeVisible(java.lang.invoke.MethodType type, Class<?> refc) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
214 |
for (int n = -1, max = type.parameterCount(); n < max; n++) { |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
215 |
Class<?> ptype = (n < 0 ? type.returnType() : type.parameterType(n)); |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
216 |
if (!isTypeVisible(ptype, refc)) |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
217 |
return false; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
218 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
219 |
return true; |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
220 |
} |
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
221 |
|
17843fff200d
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
13044
diff
changeset
|
222 |
/** |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
223 |
* Test if two classes have the same class loader and package qualifier. |
20535
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
224 |
* @param class1 a class |
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
225 |
* @param class2 another class |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
226 |
* @return whether they are in the same package |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
227 |
*/ |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
228 |
public static boolean isSamePackage(Class<?> class1, Class<?> class2) { |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
229 |
assert(!class1.isArray() && !class2.isArray()); |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
230 |
if (class1 == class2) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
231 |
return true; |
13044
8411854afc2b
7165628: Issues with java.lang.invoke.MethodHandles.Lookup
jrose
parents:
9752
diff
changeset
|
232 |
if (class1.getClassLoader() != class2.getClassLoader()) |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
233 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
234 |
String name1 = class1.getName(), name2 = class2.getName(); |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
235 |
int dot = name1.lastIndexOf('.'); |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
236 |
if (dot != name2.lastIndexOf('.')) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
237 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
238 |
for (int i = 0; i < dot; i++) { |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
239 |
if (name1.charAt(i) != name2.charAt(i)) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
240 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
241 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
242 |
return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
243 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
244 |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
245 |
/** Return the package name for this class. |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
246 |
*/ |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
247 |
public static String getPackageName(Class<?> cls) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
248 |
assert(!cls.isArray()); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
249 |
String name = cls.getName(); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
250 |
int dot = name.lastIndexOf('.'); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
251 |
if (dot < 0) return ""; |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
252 |
return name.substring(0, dot); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
253 |
} |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
254 |
|
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
255 |
/** |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
256 |
* Test if two classes are defined as part of the same package member (top-level class). |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
257 |
* If this is true, they can share private access with each other. |
20535
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
258 |
* @param class1 a class |
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
259 |
* @param class2 another class |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
260 |
* @return whether they are identical or nested together |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
261 |
*/ |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
262 |
public static boolean isSamePackageMember(Class<?> class1, Class<?> class2) { |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
263 |
if (class1 == class2) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
264 |
return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
265 |
if (!isSamePackage(class1, class2)) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
266 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
267 |
if (getOutermostEnclosingClass(class1) != getOutermostEnclosingClass(class2)) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
268 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
269 |
return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
270 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
271 |
|
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
272 |
private static Class<?> getOutermostEnclosingClass(Class<?> c) { |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
273 |
Class<?> pkgmem = c; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
274 |
for (Class<?> enc = c; (enc = enc.getEnclosingClass()) != null; ) |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
275 |
pkgmem = enc; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
276 |
return pkgmem; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
277 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
278 |
|
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
279 |
private static boolean loadersAreRelated(ClassLoader loader1, ClassLoader loader2, |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
280 |
boolean loader1MustBeParent) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
281 |
if (loader1 == loader2 || loader1 == null |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
282 |
|| (loader2 == null && !loader1MustBeParent)) { |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
283 |
return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
284 |
} |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
285 |
for (ClassLoader scan2 = loader2; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
286 |
scan2 != null; scan2 = scan2.getParent()) { |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
287 |
if (scan2 == loader1) return true; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
288 |
} |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
289 |
if (loader1MustBeParent) return false; |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
290 |
// see if loader2 is a parent of loader1: |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
291 |
for (ClassLoader scan1 = loader1; |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
292 |
scan1 != null; scan1 = scan1.getParent()) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
293 |
if (scan1 == loader2) return true; |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
294 |
} |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
295 |
return false; |
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
296 |
} |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
297 |
|
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
298 |
/** |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
299 |
* Is the class loader of parentClass identical to, or an ancestor of, |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
300 |
* the class loader of childClass? |
20535
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
301 |
* @param parentClass a class |
cc85c8626435
8024438: JSR 292 API specification maintenance for JDK 8
jrose
parents:
14342
diff
changeset
|
302 |
* @param childClass another class, which may be a descendent of the first class |
9752
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
303 |
* @return whether parentClass precedes or equals childClass in class loader order |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
304 |
*/ |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
305 |
public static boolean classLoaderIsAncestor(Class<?> parentClass, Class<?> childClass) { |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
306 |
return loadersAreRelated(parentClass.getClassLoader(), childClass.getClassLoader(), true); |
88ab34b6da6d
7032323: code changes for JSR 292 EG adjustments to API, through Public Review
jrose
parents:
8822
diff
changeset
|
307 |
} |
2707
5a17df307cbc
6829144: JSR 292 JVM features need a provisional Java API
jrose
parents:
diff
changeset
|
308 |
} |