Package org.apache.tomcat.util.compat

## Class JreCompat

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

    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
`protected static Method` `getApplicationProtocolMethod`
`protected static Method` `setApplicationProtocolsMethod`

### Constructor Summary

Constructors
`JreCompat()`

### Method Summary

All Methods Static Methods Instance Methods Concrete Methods
`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.
`boolean` `canAccess​(Object base, 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.
`String` `getApplicationProtocol​(SSLEngine sslEngine)` Get the application protocol that has been negotiated for connection associated with the given SSLEngine.
`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` `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` `isJre9Available()`
`boolean` `jarFileIsMultiRelease​(JarFile jarFile)` Is this JarFile a multi-release JAR file.
`JarFile` `jarFileNewInstance​(File f)` Creates a new JarFile instance.
`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

### Methods inherited from class java.lang.Object

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

### Field Detail

#### setApplicationProtocolsMethod

    protected static final Method setApplicationProtocolsMethod

#### getApplicationProtocolMethod

    protected static final Method getApplicationProtocolMethod

### Constructor Detail

#### JreCompat

    public JreCompat()

### Method Detail

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

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