Class UnsafeUtil


  • final class UnsafeUtil
    extends java.lang.Object
    Utility class for working with unsafe operations.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private UnsafeUtil()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      (package private) static long addressOffset​(java.nio.ByteBuffer buffer)
      Gets the offset of the address field of the given direct ByteBuffer.
      (package private) static <T> T allocateInstance​(java.lang.Class<T> clazz)  
      private static int arrayBaseOffset​(java.lang.Class<?> clazz)  
      private static int arrayIndexScale​(java.lang.Class<?> clazz)  
      private static java.lang.reflect.Field bufferAddressField()
      Finds the address field within a direct Buffer.
      (package private) static void copyMemory​(byte[] src, long srcIndex, byte[] target, long targetIndex, long length)  
      (package private) static void copyMemory​(byte[] src, long srcIndex, long targetOffset, long length)  
      (package private) static void copyMemory​(long srcOffset, byte[] target, long targetIndex, long length)  
      (package private) static boolean determineAndroidSupportByAddressSize​(java.lang.Class<?> addressClass)  
      private static java.lang.reflect.Field field​(java.lang.Class<?> clazz, java.lang.String fieldName)
      Gets the field with the given name within the class, or null if not found.
      private static long fieldOffset​(java.lang.reflect.Field field)
      Returns the offset of the provided field, or -1 if sun.misc.Unsafe is not available.
      private static int firstDifferingByteIndexNativeEndian​(long left, long right)
      Returns the index of the first byte where left and right differ, in the range [0, 8].
      (package private) static boolean getBoolean​(boolean[] target, long index)  
      (package private) static boolean getBoolean​(java.lang.Object target, long offset)  
      private static boolean getBooleanBigEndian​(java.lang.Object target, long offset)  
      private static boolean getBooleanLittleEndian​(java.lang.Object target, long offset)  
      (package private) static byte getByte​(byte[] target, long index)  
      (package private) static byte getByte​(long address)  
      (package private) static byte getByte​(java.lang.Object target, long offset)  
      private static byte getByteBigEndian​(java.lang.Object target, long offset)  
      private static byte getByteLittleEndian​(java.lang.Object target, long offset)  
      (package private) static double getDouble​(double[] target, long index)  
      (package private) static double getDouble​(java.lang.Object target, long offset)  
      (package private) static float getFloat​(float[] target, long index)  
      (package private) static float getFloat​(java.lang.Object target, long offset)  
      (package private) static int getInt​(int[] target, long index)  
      (package private) static int getInt​(long address)  
      (package private) static int getInt​(java.lang.Object target, long offset)  
      (package private) static long getLong​(long address)  
      (package private) static long getLong​(long[] target, long index)  
      (package private) static long getLong​(java.lang.Object target, long offset)  
      private static UnsafeUtil.MemoryAccessor getMemoryAccessor()
      Get a UnsafeUtil.MemoryAccessor appropriate for the platform, or null if not supported.
      (package private) static java.lang.Object getObject​(java.lang.Object[] target, long index)  
      (package private) static java.lang.Object getObject​(java.lang.Object target, long offset)  
      (package private) static java.lang.Object getStaticObject​(java.lang.reflect.Field field)  
      (package private) static sun.misc.Unsafe getUnsafe()
      Gets the sun.misc.Unsafe instance, or null if not available on this platform.
      (package private) static boolean hasUnsafeArrayOperations()  
      (package private) static boolean hasUnsafeByteBufferOperations()  
      (package private) static boolean isAndroid64()  
      private static void logMissingMethod​(java.lang.Throwable e)  
      (package private) static int mismatch​(byte[] left, int leftOff, byte[] right, int rightOff, int length)
      Returns the lowest index such that 0 <= index < length and left[leftOff + index] != right[rightOff + index].
      (package private) static long objectFieldOffset​(java.lang.reflect.Field field)  
      (package private) static void putBoolean​(boolean[] target, long index, boolean value)  
      (package private) static void putBoolean​(java.lang.Object target, long offset, boolean value)  
      private static void putBooleanBigEndian​(java.lang.Object target, long offset, boolean value)  
      private static void putBooleanLittleEndian​(java.lang.Object target, long offset, boolean value)  
      (package private) static void putByte​(byte[] target, long index, byte value)  
      (package private) static void putByte​(long address, byte value)  
      (package private) static void putByte​(java.lang.Object target, long offset, byte value)  
      private static void putByteBigEndian​(java.lang.Object target, long offset, byte value)  
      private static void putByteLittleEndian​(java.lang.Object target, long offset, byte value)  
      (package private) static void putDouble​(double[] target, long index, double value)  
      (package private) static void putDouble​(java.lang.Object target, long offset, double value)  
      (package private) static void putFloat​(float[] target, long index, float value)  
      (package private) static void putFloat​(java.lang.Object target, long offset, float value)  
      (package private) static void putInt​(int[] target, long index, int value)  
      (package private) static void putInt​(long address, int value)  
      (package private) static void putInt​(java.lang.Object target, long offset, int value)  
      (package private) static void putLong​(long[] target, long index, long value)  
      (package private) static void putLong​(long address, long value)  
      (package private) static void putLong​(java.lang.Object target, long offset, long value)  
      (package private) static void putObject​(java.lang.Object[] target, long index, java.lang.Object value)  
      (package private) static void putObject​(java.lang.Object target, long offset, java.lang.Object value)  
      private static boolean supportsUnsafeArrayOperations()  
      private static boolean supportsUnsafeByteBufferOperations()  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • UNSAFE

        private static final sun.misc.Unsafe UNSAFE
      • MEMORY_CLASS

        private static final java.lang.Class<?> MEMORY_CLASS
      • IS_ANDROID_64

        private static final boolean IS_ANDROID_64
      • IS_ANDROID_32

        private static final boolean IS_ANDROID_32
      • HAS_UNSAFE_BYTEBUFFER_OPERATIONS

        private static final boolean HAS_UNSAFE_BYTEBUFFER_OPERATIONS
      • HAS_UNSAFE_ARRAY_OPERATIONS

        private static final boolean HAS_UNSAFE_ARRAY_OPERATIONS
      • BYTE_ARRAY_BASE_OFFSET

        static final long BYTE_ARRAY_BASE_OFFSET
      • BOOLEAN_ARRAY_BASE_OFFSET

        private static final long BOOLEAN_ARRAY_BASE_OFFSET
      • BOOLEAN_ARRAY_INDEX_SCALE

        private static final long BOOLEAN_ARRAY_INDEX_SCALE
      • INT_ARRAY_BASE_OFFSET

        private static final long INT_ARRAY_BASE_OFFSET
      • INT_ARRAY_INDEX_SCALE

        private static final long INT_ARRAY_INDEX_SCALE
      • LONG_ARRAY_BASE_OFFSET

        private static final long LONG_ARRAY_BASE_OFFSET
      • LONG_ARRAY_INDEX_SCALE

        private static final long LONG_ARRAY_INDEX_SCALE
      • FLOAT_ARRAY_BASE_OFFSET

        private static final long FLOAT_ARRAY_BASE_OFFSET
      • FLOAT_ARRAY_INDEX_SCALE

        private static final long FLOAT_ARRAY_INDEX_SCALE
      • DOUBLE_ARRAY_BASE_OFFSET

        private static final long DOUBLE_ARRAY_BASE_OFFSET
      • DOUBLE_ARRAY_INDEX_SCALE

        private static final long DOUBLE_ARRAY_INDEX_SCALE
      • OBJECT_ARRAY_BASE_OFFSET

        private static final long OBJECT_ARRAY_BASE_OFFSET
      • OBJECT_ARRAY_INDEX_SCALE

        private static final long OBJECT_ARRAY_INDEX_SCALE
      • BUFFER_ADDRESS_OFFSET

        private static final long BUFFER_ADDRESS_OFFSET
      • BYTE_ARRAY_ALIGNMENT

        private static final int BYTE_ARRAY_ALIGNMENT
      • IS_BIG_ENDIAN

        static final boolean IS_BIG_ENDIAN
    • Constructor Detail

      • UnsafeUtil

        private UnsafeUtil()
    • Method Detail

      • hasUnsafeArrayOperations

        static boolean hasUnsafeArrayOperations()
      • hasUnsafeByteBufferOperations

        static boolean hasUnsafeByteBufferOperations()
      • isAndroid64

        static boolean isAndroid64()
      • allocateInstance

        static <T> T allocateInstance​(java.lang.Class<T> clazz)
      • objectFieldOffset

        static long objectFieldOffset​(java.lang.reflect.Field field)
      • arrayBaseOffset

        private static int arrayBaseOffset​(java.lang.Class<?> clazz)
      • arrayIndexScale

        private static int arrayIndexScale​(java.lang.Class<?> clazz)
      • getByte

        static byte getByte​(java.lang.Object target,
                            long offset)
      • putByte

        static void putByte​(java.lang.Object target,
                            long offset,
                            byte value)
      • getInt

        static int getInt​(java.lang.Object target,
                          long offset)
      • putInt

        static void putInt​(java.lang.Object target,
                           long offset,
                           int value)
      • getLong

        static long getLong​(java.lang.Object target,
                            long offset)
      • putLong

        static void putLong​(java.lang.Object target,
                            long offset,
                            long value)
      • getBoolean

        static boolean getBoolean​(java.lang.Object target,
                                  long offset)
      • putBoolean

        static void putBoolean​(java.lang.Object target,
                               long offset,
                               boolean value)
      • getFloat

        static float getFloat​(java.lang.Object target,
                              long offset)
      • putFloat

        static void putFloat​(java.lang.Object target,
                             long offset,
                             float value)
      • getDouble

        static double getDouble​(java.lang.Object target,
                                long offset)
      • putDouble

        static void putDouble​(java.lang.Object target,
                              long offset,
                              double value)
      • getObject

        static java.lang.Object getObject​(java.lang.Object target,
                                          long offset)
      • putObject

        static void putObject​(java.lang.Object target,
                              long offset,
                              java.lang.Object value)
      • getByte

        static byte getByte​(byte[] target,
                            long index)
      • putByte

        static void putByte​(byte[] target,
                            long index,
                            byte value)
      • getInt

        static int getInt​(int[] target,
                          long index)
      • putInt

        static void putInt​(int[] target,
                           long index,
                           int value)
      • getLong

        static long getLong​(long[] target,
                            long index)
      • putLong

        static void putLong​(long[] target,
                            long index,
                            long value)
      • getBoolean

        static boolean getBoolean​(boolean[] target,
                                  long index)
      • putBoolean

        static void putBoolean​(boolean[] target,
                               long index,
                               boolean value)
      • getFloat

        static float getFloat​(float[] target,
                              long index)
      • putFloat

        static void putFloat​(float[] target,
                             long index,
                             float value)
      • getDouble

        static double getDouble​(double[] target,
                                long index)
      • putDouble

        static void putDouble​(double[] target,
                              long index,
                              double value)
      • getObject

        static java.lang.Object getObject​(java.lang.Object[] target,
                                          long index)
      • putObject

        static void putObject​(java.lang.Object[] target,
                              long index,
                              java.lang.Object value)
      • copyMemory

        static void copyMemory​(byte[] src,
                               long srcIndex,
                               long targetOffset,
                               long length)
      • copyMemory

        static void copyMemory​(long srcOffset,
                               byte[] target,
                               long targetIndex,
                               long length)
      • copyMemory

        static void copyMemory​(byte[] src,
                               long srcIndex,
                               byte[] target,
                               long targetIndex,
                               long length)
      • getByte

        static byte getByte​(long address)
      • putByte

        static void putByte​(long address,
                            byte value)
      • getInt

        static int getInt​(long address)
      • putInt

        static void putInt​(long address,
                           int value)
      • getLong

        static long getLong​(long address)
      • putLong

        static void putLong​(long address,
                            long value)
      • addressOffset

        static long addressOffset​(java.nio.ByteBuffer buffer)
        Gets the offset of the address field of the given direct ByteBuffer.
      • getStaticObject

        static java.lang.Object getStaticObject​(java.lang.reflect.Field field)
      • getUnsafe

        static sun.misc.Unsafe getUnsafe()
        Gets the sun.misc.Unsafe instance, or null if not available on this platform.
      • supportsUnsafeArrayOperations

        private static boolean supportsUnsafeArrayOperations()
      • supportsUnsafeByteBufferOperations

        private static boolean supportsUnsafeByteBufferOperations()
      • determineAndroidSupportByAddressSize

        static boolean determineAndroidSupportByAddressSize​(java.lang.Class<?> addressClass)
      • bufferAddressField

        private static java.lang.reflect.Field bufferAddressField()
        Finds the address field within a direct Buffer.
      • firstDifferingByteIndexNativeEndian

        private static int firstDifferingByteIndexNativeEndian​(long left,
                                                               long right)
        Returns the index of the first byte where left and right differ, in the range [0, 8]. If left == right, the result will be 8, otherwise less than 8.

        This counts from the *first* byte, which may be the most or least significant byte depending on the system endianness.

      • mismatch

        static int mismatch​(byte[] left,
                            int leftOff,
                            byte[] right,
                            int rightOff,
                            int length)
        Returns the lowest index such that 0 <= index < length and left[leftOff + index] != right[rightOff + index]. If no such value exists -- if left and right match up to length bytes from their respective offsets -- returns -1.

        leftOff + length must be less than or equal to left.length, and the same for right.

      • fieldOffset

        private static long fieldOffset​(java.lang.reflect.Field field)
        Returns the offset of the provided field, or -1 if sun.misc.Unsafe is not available.
      • field

        private static java.lang.reflect.Field field​(java.lang.Class<?> clazz,
                                                     java.lang.String fieldName)
        Gets the field with the given name within the class, or null if not found.
      • getByteBigEndian

        private static byte getByteBigEndian​(java.lang.Object target,
                                             long offset)
      • getByteLittleEndian

        private static byte getByteLittleEndian​(java.lang.Object target,
                                                long offset)
      • putByteBigEndian

        private static void putByteBigEndian​(java.lang.Object target,
                                             long offset,
                                             byte value)
      • putByteLittleEndian

        private static void putByteLittleEndian​(java.lang.Object target,
                                                long offset,
                                                byte value)
      • getBooleanBigEndian

        private static boolean getBooleanBigEndian​(java.lang.Object target,
                                                   long offset)
      • getBooleanLittleEndian

        private static boolean getBooleanLittleEndian​(java.lang.Object target,
                                                      long offset)
      • putBooleanBigEndian

        private static void putBooleanBigEndian​(java.lang.Object target,
                                                long offset,
                                                boolean value)
      • putBooleanLittleEndian

        private static void putBooleanLittleEndian​(java.lang.Object target,
                                                   long offset,
                                                   boolean value)
      • logMissingMethod

        private static void logMissingMethod​(java.lang.Throwable e)