Class UnsafeUtil

java.lang.Object
com.google.protobuf.UnsafeUtil

final class UnsafeUtil extends Object
Utility class for working with unsafe operations.
  • Field Details

    • UNSAFE

      private static final sun.misc.Unsafe UNSAFE
    • MEMORY_CLASS

      private static final Class<?> MEMORY_CLASS
    • IS_ANDROID_64

      private static final boolean IS_ANDROID_64
    • IS_ANDROID_32

      private static final boolean IS_ANDROID_32
    • MEMORY_ACCESSOR

      private static final UnsafeUtil.MemoryAccessor MEMORY_ACCESSOR
    • 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
    • STRIDE

      private static final int STRIDE
      See Also:
    • STRIDE_ALIGNMENT_MASK

      private static final int STRIDE_ALIGNMENT_MASK
      See Also:
    • BYTE_ARRAY_ALIGNMENT

      private static final int BYTE_ARRAY_ALIGNMENT
    • IS_BIG_ENDIAN

      static final boolean IS_BIG_ENDIAN
  • Constructor Details

    • UnsafeUtil

      private UnsafeUtil()
  • Method Details

    • hasUnsafeArrayOperations

      static boolean hasUnsafeArrayOperations()
    • hasUnsafeByteBufferOperations

      static boolean hasUnsafeByteBufferOperations()
    • isAndroid64

      static boolean isAndroid64()
    • allocateInstance

      static <T> T allocateInstance(Class<T> clazz)
    • objectFieldOffset

      static long objectFieldOffset(Field field)
    • arrayBaseOffset

      private static int arrayBaseOffset(Class<?> clazz)
    • arrayIndexScale

      private static int arrayIndexScale(Class<?> clazz)
    • getByte

      static byte getByte(Object target, long offset)
    • putByte

      static void putByte(Object target, long offset, byte value)
    • getInt

      static int getInt(Object target, long offset)
    • putInt

      static void putInt(Object target, long offset, int value)
    • getLong

      static long getLong(Object target, long offset)
    • putLong

      static void putLong(Object target, long offset, long value)
    • getBoolean

      static boolean getBoolean(Object target, long offset)
    • putBoolean

      static void putBoolean(Object target, long offset, boolean value)
    • getFloat

      static float getFloat(Object target, long offset)
    • putFloat

      static void putFloat(Object target, long offset, float value)
    • getDouble

      static double getDouble(Object target, long offset)
    • putDouble

      static void putDouble(Object target, long offset, double value)
    • getObject

      static Object getObject(Object target, long offset)
    • putObject

      static void putObject(Object target, long offset, 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 Object getObject(Object[] target, long index)
    • putObject

      static void putObject(Object[] target, long index, 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(ByteBuffer buffer)
      Gets the offset of the address field of the given direct ByteBuffer.
    • getStaticObject

      static Object getStaticObject(Field field)
    • getUnsafe

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

      private static UnsafeUtil.MemoryAccessor getMemoryAccessor()
      Get a UnsafeUtil.MemoryAccessor appropriate for the platform, or null if not supported.
    • supportsUnsafeArrayOperations

      private static boolean supportsUnsafeArrayOperations()
    • supportsUnsafeByteBufferOperations

      private static boolean supportsUnsafeByteBufferOperations()
    • determineAndroidSupportByAddressSize

      static boolean determineAndroidSupportByAddressSize(Class<?> addressClass)
    • bufferAddressField

      private static 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(Field field)
      Returns the offset of the provided field, or -1 if sun.misc.Unsafe is not available.
    • field

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

      private static byte getByteBigEndian(Object target, long offset)
    • getByteLittleEndian

      private static byte getByteLittleEndian(Object target, long offset)
    • putByteBigEndian

      private static void putByteBigEndian(Object target, long offset, byte value)
    • putByteLittleEndian

      private static void putByteLittleEndian(Object target, long offset, byte value)
    • getBooleanBigEndian

      private static boolean getBooleanBigEndian(Object target, long offset)
    • getBooleanLittleEndian

      private static boolean getBooleanLittleEndian(Object target, long offset)
    • putBooleanBigEndian

      private static void putBooleanBigEndian(Object target, long offset, boolean value)
    • putBooleanLittleEndian

      private static void putBooleanLittleEndian(Object target, long offset, boolean value)
    • logMissingMethod

      private static void logMissingMethod(Throwable e)