< prev index next >

src/java.base/share/classes/java/lang/Class.java

Print this page
rev 17358 : 8182487: Add Unsafe.objectFieldOffset(Class, String)
Reviewed-by: dsimms, twisti, bchristi, mgerdin

*** 2854,2883 **** private static class Atomic { // initialize Unsafe machinery here, since we need to call Class.class instance method // and have to avoid calling it in the static initializer of the Class class... private static final Unsafe unsafe = Unsafe.getUnsafe(); // offset of Class.reflectionData instance field ! private static final long reflectionDataOffset; // offset of Class.annotationType instance field ! private static final long annotationTypeOffset; // offset of Class.annotationData instance field ! private static final long annotationDataOffset; ! ! static { ! Field[] fields = Class.class.getDeclaredFields0(false); // bypass caches ! reflectionDataOffset = objectFieldOffset(fields, "reflectionData"); ! annotationTypeOffset = objectFieldOffset(fields, "annotationType"); ! annotationDataOffset = objectFieldOffset(fields, "annotationData"); ! } ! ! private static long objectFieldOffset(Field[] fields, String fieldName) { ! Field field = searchFields(fields, fieldName); ! if (field == null) { ! throw new Error("No " + fieldName + " field found in java.lang.Class"); ! } ! return unsafe.objectFieldOffset(field); ! } static <T> boolean casReflectionData(Class<?> clazz, SoftReference<ReflectionData<T>> oldData, SoftReference<ReflectionData<T>> newData) { return unsafe.compareAndSetObject(clazz, reflectionDataOffset, oldData, newData); --- 2854,2871 ---- private static class Atomic { // initialize Unsafe machinery here, since we need to call Class.class instance method // and have to avoid calling it in the static initializer of the Class class... private static final Unsafe unsafe = Unsafe.getUnsafe(); // offset of Class.reflectionData instance field ! private static final long reflectionDataOffset ! = unsafe.objectFieldOffset(Class.class, "reflectionData"); // offset of Class.annotationType instance field ! private static final long annotationTypeOffset ! = unsafe.objectFieldOffset(Class.class, "annotationType"); // offset of Class.annotationData instance field ! private static final long annotationDataOffset ! = unsafe.objectFieldOffset(Class.class, "annotationData"); static <T> boolean casReflectionData(Class<?> clazz, SoftReference<ReflectionData<T>> oldData, SoftReference<ReflectionData<T>> newData) { return unsafe.compareAndSetObject(clazz, reflectionDataOffset, oldData, newData);
< prev index next >