Class JreCompat

  • Direct Known Subclasses:
    Jre19Compat

    public class JreCompat
    extends java.lang.Object
    This is the base implementation class for JRE compatibility and provides an implementation based on Java 7. Sub-classes may extend this class and provide alternative implementations for later JRE versions
    • Constructor Summary

      Constructors 
      Constructor Description
      JreCompat()  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void addBootModulePath​(java.util.Deque<java.net.URL> classPathUrlsToProcess)
      Obtains the URLs for all the JARs on the module path when the JVM starts and adds them to the provided Deque.
      boolean canAccess​(java.lang.Object base, java.lang.reflect.AccessibleObject accessibleObject)
      Is the accessibleObject accessible (as a result of appropriate module exports) on the provided instance?
      void disableCachingForJarUrlConnections()
      Disables caching for JAR URL connections.
      java.lang.String getApplicationProtocol​(javax.net.ssl.SSLEngine sslEngine)
      Get the application protocol that has been negotiated for connection associated with the given SSLEngine.
      java.security.KeyStore.LoadStoreParameter getDomainLoadStoreParameter​(java.net.URI uri)  
      java.lang.Object getExecutor​(java.lang.Thread thread)
      Obtains the executor, if any, used to create the provided thread.
      static JreCompat getInstance()  
      java.lang.String getModuleName​(java.lang.Class<?> type)
      What is the module of the given class?
      static boolean isAlpnSupported()  
      boolean isExported​(java.lang.Class<?> type)
      Is the given class in an exported package?
      boolean isInstanceOfInaccessibleObjectException​(java.lang.Throwable t)
      Test if the provided exception is an instance of java.lang.reflect.InaccessibleObjectException.
      static boolean isJre11Available()  
      static boolean isJre19Available()  
      static boolean isJre8Available()  
      static boolean isJre9Available()  
      boolean jarFileIsMultiRelease​(java.util.jar.JarFile jarFile)
      Is this JarFile a multi-release JAR file.
      java.util.jar.JarFile jarFileNewInstance​(java.io.File f)
      Creates a new JarFile instance.
      java.util.jar.JarFile jarFileNewInstance​(java.lang.String s)
      Creates a new JarFile instance.
      int jarFileRuntimeMajorVersion()  
      void setApplicationProtocols​(javax.net.ssl.SSLParameters sslParameters, java.lang.String[] protocols)
      Set the application protocols the server will accept for ALPN
      void setUseServerCipherSuitesOrder​(javax.net.ssl.SSLParameters engine, boolean useCipherSuitesOrder)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • JreCompat

        public JreCompat()
    • Method Detail

      • getInstance

        public static JreCompat getInstance()
      • isJre8Available

        public static boolean isJre8Available()
      • setUseServerCipherSuitesOrder

        public void setUseServerCipherSuitesOrder​(javax.net.ssl.SSLParameters engine,
                                                  boolean useCipherSuitesOrder)
      • getDomainLoadStoreParameter

        public java.security.KeyStore.LoadStoreParameter getDomainLoadStoreParameter​(java.net.URI uri)
      • isAlpnSupported

        public static boolean isAlpnSupported()
      • isJre9Available

        public static boolean isJre9Available()
      • isInstanceOfInaccessibleObjectException

        public boolean isInstanceOfInaccessibleObjectException​(java.lang.Throwable t)
        Test if the provided exception is an instance of java.lang.reflect.InaccessibleObjectException.
        Parameters:
        t - The exception to test
        Returns:
        true if the exception is an instance of InaccessibleObjectException, otherwise false
      • setApplicationProtocols

        public void setApplicationProtocols​(javax.net.ssl.SSLParameters sslParameters,
                                            java.lang.String[] protocols)
        Set the application protocols the server will accept for ALPN
        Parameters:
        sslParameters - The SSL parameters for a connection
        protocols - The application protocols to be allowed for that connection
      • getApplicationProtocol

        public java.lang.String getApplicationProtocol​(javax.net.ssl.SSLEngine sslEngine)
        Get the application protocol that has been negotiated for connection associated with the given SSLEngine.
        Parameters:
        sslEngine - The SSLEngine for which to obtain the negotiated protocol
        Returns:
        The name of the negotiated protocol
      • disableCachingForJarUrlConnections

        public void disableCachingForJarUrlConnections()
                                                throws java.io.IOException
        Disables caching for JAR URL connections. For Java 8 and earlier, this also disables caching for ALL URL connections.
        Throws:
        java.io.IOException - If a dummy JAR URLConnection can not be created
      • addBootModulePath

        public void addBootModulePath​(java.util.Deque<java.net.URL> classPathUrlsToProcess)
        Obtains the URLs for all the JARs on the module path when the JVM starts and adds them to the provided Deque.
        Parameters:
        classPathUrlsToProcess - The Deque to which the modules should be added
      • jarFileNewInstance

        public final java.util.jar.JarFile jarFileNewInstance​(java.lang.String s)
                                                       throws java.io.IOException
        Creates a new JarFile instance. When running on Java 9 and later, the JarFile will be multi-release JAR aware. While this isn't strictly required to be in this package, it is provided as a convenience method.
        Parameters:
        s - The JAR file to open
        Returns:
        A JarFile instance based on the provided path
        Throws:
        java.io.IOException - If an I/O error occurs creating the JarFile instance
      • jarFileNewInstance

        public java.util.jar.JarFile jarFileNewInstance​(java.io.File f)
                                                 throws java.io.IOException
        Creates a new JarFile instance. When running on Java 9 and later, the JarFile will be multi-release JAR aware.
        Parameters:
        f - The JAR file to open
        Returns:
        A JarFile instance based on the provided file
        Throws:
        java.io.IOException - If an I/O error occurs creating the JarFile instance
      • jarFileIsMultiRelease

        public boolean jarFileIsMultiRelease​(java.util.jar.JarFile jarFile)
        Is this JarFile a multi-release JAR file.
        Parameters:
        jarFile - The JarFile to test
        Returns:
        true If it is a multi-release JAR file and is configured to behave as such.
      • jarFileRuntimeMajorVersion

        public int jarFileRuntimeMajorVersion()
      • canAccess

        public boolean canAccess​(java.lang.Object base,
                                 java.lang.reflect.AccessibleObject accessibleObject)
        Is the accessibleObject accessible (as a result of appropriate module exports) on the provided instance?
        Parameters:
        base - The specific instance to be tested.
        accessibleObject - The method/field/constructor to be tested.
        Returns:
        {code true} if the AccessibleObject can be accessed otherwise {code false}
      • isExported

        public boolean isExported​(java.lang.Class<?> type)
        Is the given class in an exported package?
        Parameters:
        type - The class to test
        Returns:
        Always true for Java 8. true if the enclosing package is exported for Java 9+
      • getModuleName

        public java.lang.String getModuleName​(java.lang.Class<?> type)
        What is the module of the given class?
        Parameters:
        type - The class to test
        Returns:
        Always true for Java 8. true if the enclosing package is exported for Java 9+
      • isJre11Available

        public static boolean isJre11Available()
      • isJre19Available

        public static boolean isJre19Available()
      • getExecutor

        public java.lang.Object getExecutor​(java.lang.Thread thread)
                                     throws java.lang.NoSuchFieldException,
                                            java.lang.SecurityException,
                                            java.lang.IllegalArgumentException,
                                            java.lang.IllegalAccessException
        Obtains the executor, if any, used to create the provided thread.
        Parameters:
        thread - The thread to examine
        Returns:
        The executor, if any, that created the provided thread
        Throws:
        java.lang.NoSuchFieldException - If a field used via reflection to obtain the executor cannot be found
        java.lang.SecurityException - If a security exception occurs while trying to identify the executor
        java.lang.IllegalArgumentException - If the instance object does not match the class of the field when obtaining a field value via reflection
        java.lang.IllegalAccessException - If a field is not accessible due to access restrictions