Package org.apache.tomcat.util.compat

# Class JreCompat

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

Direct Known Subclasses:
  `Jre19Compat`

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

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `protected static final Method`
  `getApplicationProtocolMethod`
  `protected static final Method`
  `setApplicationProtocolsMethod`

- ## 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.
  `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`
  `isJre16Available()`
  `static boolean`
  `isJre19Available()`
  `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`
  `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 java.lang.Object

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

- ## Field Details

  - ### 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()

  - ### isJre16Available

    public static boolean isJre16Available()

  - ### isJre19Available

    public static boolean isJre19Available()

  - ### 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`