# Class JreCompat

java.lang.Object
org.apache.tomcat.util.compat.JreCompat

Direct Known Subclasses:
  `Jre12Compat`

public class JreCompat extends Object
This is the base implementation class for JRE compatibility and provides an implementation based on Java 8. Subclasses may extend this class and provide alternative implementations for later JRE versions

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected static Boolean`
  `canonCachesDisabled`
  `protected static final Object`
  `canonCachesDisabledLock`
  `protected static final Method`
  `getApplicationProtocolMethod`
  `protected static final Method`
  `setApplicationProtocolsMethod`
  `protected static final String`
  `USE_CANON_CACHES_CMD_ARG`
  `protected static Optional<Field>`
  `useCanonCachesField`
  `protected static final Object`
  `useCanonCachesFieldLock`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `JreCompat()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addBootModulePath(Deque<URL> classPathUrlsToProcess)`
  Obtains the URLs for all the JARs on the module path when the JVM starts and adds them to the provided Deque.
  `<T> T`
  `callAs(Subject subject, Callable<T> action)`
  `boolean`
  `canAccess(Object base, AccessibleObject accessibleObject)`
  Is the accessibleObject accessible (as a result of appropriate module exports) on the provided instance?
  `Object`
  `createVirtualThreadBuilder(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.
  `boolean`
  `disableCanonCaches()`
  Disable the global canonical file cache.
  `protected void`
  `ensureUseCanonCachesFieldIsPopulated()`
  `String`
  `getApplicationProtocol(SSLEngine sslEngine)`
  Get the application protocol that has been negotiated for connection associated with the given SSLEngine.
  `Object`
  `getExecutor(Thread thread)`
  Obtains the executor, if any, used to create the provided thread.
  `static JreCompat`
  `getInstance()`
  `String`
  `getModuleName(Class<?> type)`
  What is the module of the given class?
  `SocketAddress`
  `getUnixDomainSocketAddress(String path)`
  Return Unix domain socket address for given path.
  `static boolean`
  `isAlpnSupported()`
  `boolean`
  `isCanonCachesDisabled()`
  `boolean`
  `isExported(Class<?> type)`
  Is the given class in an exported package?
  `static boolean`
  `isGraalAvailable()`
  `boolean`
  `isInstanceOfInaccessibleObjectException(Throwable t)`
  Test if the provided exception is an instance of java.lang.reflect.InaccessibleObjectException.
  `static boolean`
  `isJre11Available()`
  `static boolean`
  `isJre12Available()`
  `static boolean`
  `isJre16Available()`
  `static boolean`
  `isJre19Available()`
  `static boolean`
  `isJre20Available()`
  `static boolean`
  `isJre21Available()`
  `static boolean`
  `isJre22Available()`
  `static boolean`
  `isJre9Available()`
  `boolean`
  `jarFileIsMultiRelease(JarFile jarFile)`
  Is this JarFile a multi-release JAR file.
  `JarFile`
  `jarFileNewInstance(File f)`
  Creates a new JarFile instance.
  `final JarFile`
  `jarFileNewInstance(String s)`
  Creates a new JarFile instance.
  `int`
  `jarFileRuntimeMajorVersion()`
  `ServerSocketChannel`
  `openUnixDomainServerSocketChannel()`
  Create server socket channel using the Unix domain socket ProtocolFamily.
  `SocketChannel`
  `openUnixDomainSocketChannel()`
  Create socket channel using the Unix domain socket ProtocolFamily.
  `void`
  `setApplicationProtocols(SSLParameters sslParameters, String[] protocols)`
  Set the application protocols the server will accept for ALPN
  `void`
  `setNamedGroupsMethod(Object sslParameters, String[] names)`
  TLS groups configuration from JSSE API in Java 20.
  `void`
  `threadBuilderStart(Object threadBuilder, Runnable command)`
  Create a thread with the given thread builder and use it to execute the given runnable.

  ### Methods inherited from class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### USE_CANON_CACHES_CMD_ARG

    protected static final String USE_CANON_CACHES_CMD_ARG
    See Also:
      - Constant Field Values

  - ### canonCachesDisabled

    protected static volatile Boolean canonCachesDisabled

  - ### canonCachesDisabledLock

    protected static final Object canonCachesDisabledLock

  - ### useCanonCachesField

    protected static volatile Optional<Field> useCanonCachesField

  - ### useCanonCachesFieldLock

    protected static final Object useCanonCachesFieldLock

  - ### setApplicationProtocolsMethod

    protected static final Method setApplicationProtocolsMethod

  - ### getApplicationProtocolMethod

    protected static final Method getApplicationProtocolMethod

- ## Constructor Details

  - ### JreCompat

    public JreCompat()

- ## Method Details

  - ### getInstance

    public static JreCompat getInstance()

  - ### isGraalAvailable

    public static boolean isGraalAvailable()

  - ### isAlpnSupported

    public static boolean isAlpnSupported()

  - ### isJre9Available

    public static boolean isJre9Available()

  - ### isJre11Available

    public static boolean isJre11Available()

  - ### isJre12Available

    public static boolean isJre12Available()

  - ### isJre16Available

    public static boolean isJre16Available()

  - ### isJre19Available

    public static boolean isJre19Available()

  - ### isJre20Available

    public static boolean isJre20Available()

  - ### isJre21Available

    public static boolean isJre21Available()

  - ### isJre22Available

    public static boolean isJre22Available()

  - ### isInstanceOfInaccessibleObjectException

    public boolean isInstanceOfInaccessibleObjectException(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(SSLParameters sslParameters, 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 String getApplicationProtocol(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 IOException
    Disables caching for JAR URL connections. For Java 8 and earlier, this also disables caching for ALL URL connections.
    Throws:
      `IOException` - If a dummy JAR URLConnection can not be created

  - ### addBootModulePath

    public void addBootModulePath(Deque<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 JarFile jarFileNewInstance(String s) throws 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:
      `IOException` - If an I/O error occurs creating the JarFile instance

  - ### jarFileNewInstance

    public JarFile jarFileNewInstance(File f) throws 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:
      `IOException` - If an I/O error occurs creating the JarFile instance

  - ### jarFileIsMultiRelease

    public boolean jarFileIsMultiRelease(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(Object base, 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(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 String getModuleName(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+

  - ### getUnixDomainSocketAddress

    public SocketAddress getUnixDomainSocketAddress(String path)
    Return Unix domain socket address for given path.
    Parameters:
      `path` - The path
    Returns:
      the socket address

  - ### openUnixDomainServerSocketChannel

    public ServerSocketChannel openUnixDomainServerSocketChannel()
    Create server socket channel using the Unix domain socket ProtocolFamily.
    Returns:
      the server socket channel

  - ### openUnixDomainSocketChannel

    public SocketChannel openUnixDomainSocketChannel()
    Create socket channel using the Unix domain socket ProtocolFamily.
    Returns:
      the socket channel

  - ### getExecutor

    public Object getExecutor(Thread thread) throws NoSuchFieldException, SecurityException, IllegalArgumentException, 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:
      `NoSuchFieldException` - If a field used via reflection to obtain the executor cannot be found
      `SecurityException` - If a security exception occurs while trying to identify the executor
      `IllegalArgumentException` - If the instance object does not match the class of the field when obtaining a field value via reflection
      `IllegalAccessException` - If a field is not accessible due to access restrictions

  - ### createVirtualThreadBuilder

    public Object createVirtualThreadBuilder(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(Object threadBuilder, 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

  - ### callAs

    public <T> T callAs(Subject subject, Callable<T> action) throws CompletionException
    Throws:
      `CompletionException`

  - ### isCanonCachesDisabled

    public boolean isCanonCachesDisabled()

  - ### disableCanonCaches

    public boolean disableCanonCaches()
    Disable the global canonical file cache.
    Returns:
      `true` if the global canonical file cache was already disabled prior to this call or was disabled as a result of this call, otherwise `false`

  - ### ensureUseCanonCachesFieldIsPopulated

    protected void ensureUseCanonCachesFieldIsPopulated()

  - ### setNamedGroupsMethod

    public void setNamedGroupsMethod(Object sslParameters, String[] names)
    TLS groups configuration from JSSE API in Java 20.
    Parameters:
      `sslParameters` - the parameters object
      `names` - the names of the groups to enable