< prev index next >

src/jdk.dynalink/share/classes/jdk/dynalink/beans/ClassString.java

Print this page




  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     /**


< prev index next >