71 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
72 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
73 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
74 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
75 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
76 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
77 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
78 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
79 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
80 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
81 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
82 */
83
84 package jdk.dynalink.beans;
85
86 import java.lang.invoke.MethodHandle;
87 import java.lang.invoke.MethodType;
88 import java.security.AccessControlContext;
89 import java.security.AccessController;
90 import java.security.PrivilegedAction;
91 import java.util.LinkedList;
92 import java.util.List;
93 import jdk.dynalink.internal.AccessControlContextFactory;
94 import jdk.dynalink.internal.InternalTypeUtilities;
95 import jdk.dynalink.linker.LinkerServices;
96 import jdk.dynalink.linker.support.TypeUtilities;
97
98 /**
99 * Represents a sequence of {@link Class} objects, useful for representing method signatures. Provides value
100 * semantics for using them as map keys, as well as specificity calculations and applicability checks as per
101 * JLS.
102 */
103 final class ClassString {
104 private static final AccessControlContext GET_CLASS_LOADER_CONTEXT =
105 AccessControlContextFactory.createAccessControlContext("getClassLoader");
106
107 /**
108 * An anonymous inner class used solely to represent the "type" of null values for method applicability checking.
109 */
110 static final Class<?> NULL_CLASS = (new Object() { /* Intentionally empty */ }).getClass();
132 for(int i = 0; i < otherClasses.length; ++i) {
133 if(otherClasses[i] != classes[i]) {
134 return false;
135 }
136 }
137 return true;
138 }
139
140 @Override
141 public int hashCode() {
142 if(hashCode == 0) {
143 int h = 0;
144 for(int i = 0; i < classes.length; ++i) {
145 h ^= classes[i].hashCode();
146 }
147 hashCode = h;
148 }
149 return hashCode;
150 }
151
152 boolean isVisibleFrom(final ClassLoader classLoader) {
153 return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
154 @Override
155 public Boolean run() {
156 for(final Class<?> clazz: classes) {
157 if(!InternalTypeUtilities.canReferenceDirectly(classLoader, clazz.getClassLoader())) {
158 return false;
159 }
160 }
161 return true;
162 }
163 }, GET_CLASS_LOADER_CONTEXT);
164 }
165
166 List<MethodHandle> getMaximallySpecifics(final List<MethodHandle> methods, final LinkerServices linkerServices, final boolean varArg) {
167 return MaximallySpecific.getMaximallySpecificMethodHandles(getApplicables(methods, linkerServices, varArg),
168 varArg, classes, linkerServices);
169 }
170
171 /**
|
71 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
72 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
73 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
74 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDER
75 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
76 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
77 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
78 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
79 WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
80 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
81 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
82 */
83
84 package jdk.dynalink.beans;
85
86 import java.lang.invoke.MethodHandle;
87 import java.lang.invoke.MethodType;
88 import java.security.AccessControlContext;
89 import java.security.AccessController;
90 import java.security.PrivilegedAction;
91 import java.util.Arrays;
92 import java.util.LinkedList;
93 import java.util.List;
94 import jdk.dynalink.internal.AccessControlContextFactory;
95 import jdk.dynalink.internal.InternalTypeUtilities;
96 import jdk.dynalink.linker.LinkerServices;
97 import jdk.dynalink.linker.support.TypeUtilities;
98
99 /**
100 * Represents a sequence of {@link Class} objects, useful for representing method signatures. Provides value
101 * semantics for using them as map keys, as well as specificity calculations and applicability checks as per
102 * JLS.
103 */
104 final class ClassString {
105 private static final AccessControlContext GET_CLASS_LOADER_CONTEXT =
106 AccessControlContextFactory.createAccessControlContext("getClassLoader");
107
108 /**
109 * An anonymous inner class used solely to represent the "type" of null values for method applicability checking.
110 */
111 static final Class<?> NULL_CLASS = (new Object() { /* Intentionally empty */ }).getClass();
133 for(int i = 0; i < otherClasses.length; ++i) {
134 if(otherClasses[i] != classes[i]) {
135 return false;
136 }
137 }
138 return true;
139 }
140
141 @Override
142 public int hashCode() {
143 if(hashCode == 0) {
144 int h = 0;
145 for(int i = 0; i < classes.length; ++i) {
146 h ^= classes[i].hashCode();
147 }
148 hashCode = h;
149 }
150 return hashCode;
151 }
152
153 @Override
154 public String toString() {
155 return "ClassString[" + Arrays.toString(classes) + "]";
156 }
157
158 boolean isVisibleFrom(final ClassLoader classLoader) {
159 return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
160 @Override
161 public Boolean run() {
162 for(final Class<?> clazz: classes) {
163 if(!InternalTypeUtilities.canReferenceDirectly(classLoader, clazz.getClassLoader())) {
164 return false;
165 }
166 }
167 return true;
168 }
169 }, GET_CLASS_LOADER_CONTEXT);
170 }
171
172 List<MethodHandle> getMaximallySpecifics(final List<MethodHandle> methods, final LinkerServices linkerServices, final boolean varArg) {
173 return MaximallySpecific.getMaximallySpecificMethodHandles(getApplicables(methods, linkerServices, varArg),
174 varArg, classes, linkerServices);
175 }
176
177 /**
|