# 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 11. Sub-classes 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 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
  `<T> T`
  `callAs(Subject subject, Callable<T> action)`
  `Object`
  `createVirtualThreadBuilder(String name)`
  Create a thread builder for virtual threads using the given name to name the threads.
  `boolean`
  `disableCanonCaches()`
  Disable the global canonical file cache.
  `protected void`
  `ensureUseCanonCachesFieldIsPopulated()`
  `Object`
  `getExecutor(Thread thread)`
  Obtains the executor, if any, used to create the provided thread.
  `static JreCompat`
  `getInstance()`
  `SocketAddress`
  `getUnixDomainSocketAddress(String path)`
  Return Unix domain socket address for given path.
  `boolean`
  `isCanonCachesDisabled()`
  `static boolean`
  `isGraalAvailable()`
  `static boolean`
  `isJre12Available()`
  `static boolean`
  `isJre16Available()`
  `static boolean`
  `isJre19Available()`
  `static boolean`
  `isJre21Available()`
  `static boolean`
  `isJre22Available()`
  `ServerSocketChannel`
  `openUnixDomainServerSocketChannel()`
  Create server socket channel using the Unix domain socket ProtocolFamily.
  `SocketChannel`
  `openUnixDomainSocketChannel()`
  Create socket channel using the Unix domain socket ProtocolFamily.
  `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

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

- ## Constructor Details

  - ### JreCompat

    public JreCompat()

- ## Method Details

  - ### getInstance

    public static JreCompat getInstance()

  - ### isGraalAvailable

    public static boolean isGraalAvailable()

  - ### isJre12Available

    public static boolean isJre12Available()

  - ### isJre16Available

    public static boolean isJre16Available()

  - ### isJre19Available

    public static boolean isJre19Available()

  - ### isJre21Available

    public static boolean isJre21Available()

  - ### isJre22Available

    public static boolean isJre22Available()

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