Package com.google.protobuf
Class UnsafeUtil
- java.lang.Object
-
- com.google.protobuf.UnsafeUtil
-
final class UnsafeUtil extends java.lang.ObjectUtility class for working with unsafe operations.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classUnsafeUtil.Android32MemoryAccessorprivate static classUnsafeUtil.Android64MemoryAccessorprivate static classUnsafeUtil.JvmMemoryAccessorprivate static classUnsafeUtil.MemoryAccessor
-
Field Summary
Fields Modifier and Type Field Description private static longBOOLEAN_ARRAY_BASE_OFFSETprivate static longBOOLEAN_ARRAY_INDEX_SCALEprivate static longBUFFER_ADDRESS_OFFSETprivate static intBYTE_ARRAY_ALIGNMENT(package private) static longBYTE_ARRAY_BASE_OFFSETprivate static longDOUBLE_ARRAY_BASE_OFFSETprivate static longDOUBLE_ARRAY_INDEX_SCALEprivate static longFLOAT_ARRAY_BASE_OFFSETprivate static longFLOAT_ARRAY_INDEX_SCALEprivate static booleanHAS_UNSAFE_ARRAY_OPERATIONSprivate static booleanHAS_UNSAFE_BYTEBUFFER_OPERATIONSprivate static longINT_ARRAY_BASE_OFFSETprivate static longINT_ARRAY_INDEX_SCALEprivate static booleanIS_ANDROID_32private static booleanIS_ANDROID_64(package private) static booleanIS_BIG_ENDIANprivate static longLONG_ARRAY_BASE_OFFSETprivate static longLONG_ARRAY_INDEX_SCALEprivate static UnsafeUtil.MemoryAccessorMEMORY_ACCESSORprivate static java.lang.Class<?>MEMORY_CLASSprivate static longOBJECT_ARRAY_BASE_OFFSETprivate static longOBJECT_ARRAY_INDEX_SCALEprivate static intSTRIDEprivate static intSTRIDE_ALIGNMENT_MASKprivate static sun.misc.UnsafeUNSAFE
-
Constructor Summary
Constructors Modifier Constructor Description privateUnsafeUtil()
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description (package private) static longaddressOffset(java.nio.ByteBuffer buffer)Gets the offset of theaddressfield of the given directByteBuffer.(package private) static <T> TallocateInstance(java.lang.Class<T> clazz)private static intarrayBaseOffset(java.lang.Class<?> clazz)private static intarrayIndexScale(java.lang.Class<?> clazz)private static java.lang.reflect.FieldbufferAddressField()Finds the address field within a directBuffer.(package private) static voidcopyMemory(byte[] src, long srcIndex, byte[] target, long targetIndex, long length)(package private) static voidcopyMemory(byte[] src, long srcIndex, long targetOffset, long length)(package private) static voidcopyMemory(long srcOffset, byte[] target, long targetIndex, long length)(package private) static booleandetermineAndroidSupportByAddressSize(java.lang.Class<?> addressClass)private static java.lang.reflect.Fieldfield(java.lang.Class<?> clazz, java.lang.String fieldName)Gets the field with the given name within the class, ornullif not found.private static longfieldOffset(java.lang.reflect.Field field)Returns the offset of the provided field, or-1ifsun.misc.Unsafeis not available.private static intfirstDifferingByteIndexNativeEndian(long left, long right)Returns the index of the first byte where left and right differ, in the range [0, 8].(package private) static booleangetBoolean(boolean[] target, long index)(package private) static booleangetBoolean(java.lang.Object target, long offset)private static booleangetBooleanBigEndian(java.lang.Object target, long offset)private static booleangetBooleanLittleEndian(java.lang.Object target, long offset)(package private) static bytegetByte(byte[] target, long index)(package private) static bytegetByte(long address)(package private) static bytegetByte(java.lang.Object target, long offset)private static bytegetByteBigEndian(java.lang.Object target, long offset)private static bytegetByteLittleEndian(java.lang.Object target, long offset)(package private) static doublegetDouble(double[] target, long index)(package private) static doublegetDouble(java.lang.Object target, long offset)(package private) static floatgetFloat(float[] target, long index)(package private) static floatgetFloat(java.lang.Object target, long offset)(package private) static intgetInt(int[] target, long index)(package private) static intgetInt(long address)(package private) static intgetInt(java.lang.Object target, long offset)(package private) static longgetLong(long address)(package private) static longgetLong(long[] target, long index)(package private) static longgetLong(java.lang.Object target, long offset)private static UnsafeUtil.MemoryAccessorgetMemoryAccessor()Get aUnsafeUtil.MemoryAccessorappropriate for the platform, or null if not supported.(package private) static java.lang.ObjectgetObject(java.lang.Object[] target, long index)(package private) static java.lang.ObjectgetObject(java.lang.Object target, long offset)(package private) static java.lang.ObjectgetStaticObject(java.lang.reflect.Field field)(package private) static sun.misc.UnsafegetUnsafe()Gets thesun.misc.Unsafeinstance, ornullif not available on this platform.(package private) static booleanhasUnsafeArrayOperations()(package private) static booleanhasUnsafeByteBufferOperations()(package private) static booleanisAndroid64()private static voidlogMissingMethod(java.lang.Throwable e)(package private) static intmismatch(byte[] left, int leftOff, byte[] right, int rightOff, int length)Returns the lowestindexsuch that0 <= index < lengthandleft[leftOff + index] != right[rightOff + index].(package private) static longobjectFieldOffset(java.lang.reflect.Field field)(package private) static voidputBoolean(boolean[] target, long index, boolean value)(package private) static voidputBoolean(java.lang.Object target, long offset, boolean value)private static voidputBooleanBigEndian(java.lang.Object target, long offset, boolean value)private static voidputBooleanLittleEndian(java.lang.Object target, long offset, boolean value)(package private) static voidputByte(byte[] target, long index, byte value)(package private) static voidputByte(long address, byte value)(package private) static voidputByte(java.lang.Object target, long offset, byte value)private static voidputByteBigEndian(java.lang.Object target, long offset, byte value)private static voidputByteLittleEndian(java.lang.Object target, long offset, byte value)(package private) static voidputDouble(double[] target, long index, double value)(package private) static voidputDouble(java.lang.Object target, long offset, double value)(package private) static voidputFloat(float[] target, long index, float value)(package private) static voidputFloat(java.lang.Object target, long offset, float value)(package private) static voidputInt(int[] target, long index, int value)(package private) static voidputInt(long address, int value)(package private) static voidputInt(java.lang.Object target, long offset, int value)(package private) static voidputLong(long[] target, long index, long value)(package private) static voidputLong(long address, long value)(package private) static voidputLong(java.lang.Object target, long offset, long value)(package private) static voidputObject(java.lang.Object[] target, long index, java.lang.Object value)(package private) static voidputObject(java.lang.Object target, long offset, java.lang.Object value)private static booleansupportsUnsafeArrayOperations()private static booleansupportsUnsafeByteBufferOperations()
-
-
-
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
-
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:
- Constant Field Values
-
STRIDE_ALIGNMENT_MASK
private static final int STRIDE_ALIGNMENT_MASK
- See Also:
- Constant Field Values
-
BYTE_ARRAY_ALIGNMENT
private static final int BYTE_ARRAY_ALIGNMENT
-
IS_BIG_ENDIAN
static final boolean IS_BIG_ENDIAN
-
-
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 theaddressfield of the given directByteBuffer.
-
getStaticObject
static java.lang.Object getStaticObject(java.lang.reflect.Field field)
-
getUnsafe
static sun.misc.Unsafe getUnsafe()
Gets thesun.misc.Unsafeinstance, ornullif not available on this platform.
-
getMemoryAccessor
private static UnsafeUtil.MemoryAccessor getMemoryAccessor()
Get aUnsafeUtil.MemoryAccessorappropriate for the platform, or null if not supported.
-
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 directBuffer.
-
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]. Ifleft == 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 lowestindexsuch that0 <= index < lengthandleft[leftOff + index] != right[rightOff + index]. If no such value exists -- ifleftandrightmatch up tolengthbytes from their respective offsets -- returns -1.leftOff + lengthmust be less than or equal toleft.length, and the same forright.
-
fieldOffset
private static long fieldOffset(java.lang.reflect.Field field)
Returns the offset of the provided field, or-1ifsun.misc.Unsafeis 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, ornullif 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)
-
-