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?
      java.lang.Object createVirtualThreadBuilder​(java.lang.String name)
      Create a thread builder for virtual threads using the given name to name the threads.
      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 isJre16Available()  
      static boolean isJre19Available()  
      static boolean isJre21Available()  
      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)  
      void threadBuilderStart​(java.lang.Object threadBuilder, java.lang.Runnable command)
      Create a thread with the given thread builder and use it to execute the given runnable.
      • 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()
      • isAlpnSupported

        public static boolean isAlpnSupported()
      • isJre8Available

        public static boolean isJre8Available()
      • isJre9Available

        public static boolean isJre9Available()
      • isJre11Available

        public static boolean isJre11Available()
      • isJre16Available

        public static boolean isJre16Available()
      • isJre19Available

        public static boolean isJre19Available()
      • isJre21Available

        public static boolean isJre21Available()
      • setUseServerCipherSuitesOrder

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

        public java.security.KeyStore.LoadStoreParameter getDomainLoadStoreParameter​(java.net.URI uri)
      • 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+
      • 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
      • createVirtualThreadBuilder

        public java.lang.Object createVirtualThreadBuilder​(java.lang.String name)
        Create a thread builder for virtual threads using the given name to name the threads.
        Parameters:
        name - The base name for the threads
        Returns:
        The thread buidler for virtual threads
      • threadBuilderStart

        public void threadBuilderStart​(java.lang.Object threadBuilder,
                                       java.lang.Runnable command)
        Create a thread with the given thread builder and use it to execute the given runnable.
        Parameters:
        threadBuilder - The thread builder to use to create a thread
        command - The command to run