< prev index next >

src/java.base/share/classes/jdk/internal/reflect/UnsafeFieldAccessorImpl.java

Print this page

        

*** 25,34 **** --- 25,36 ---- package jdk.internal.reflect; import java.lang.reflect.Field; import java.lang.reflect.Modifier; + import java.util.Objects; + import jdk.internal.misc.Unsafe; /** Base class for jdk.internal.misc.Unsafe-based FieldAccessors. The observation is that there are only nine types of fields from the standpoint of reflection code: the eight primitive types and
*** 36,68 **** memory and loading time for the dynamically-generated FieldAccessors. */ abstract class UnsafeFieldAccessorImpl extends FieldAccessorImpl { static final Unsafe unsafe = Unsafe.getUnsafe(); protected final Field field; protected final long fieldOffset; protected final boolean isFinal; ! protected final boolean isFlattened; UnsafeFieldAccessorImpl(Field field) { this.field = field; if (Modifier.isStatic(field.getModifiers())) ! fieldOffset = unsafe.staticFieldOffset(field); else ! fieldOffset = unsafe.objectFieldOffset(field); ! isFinal = Modifier.isFinal(field.getModifiers()); ! isFlattened = ReflectionFactory.langReflectAccess().isFlattened(field); } protected void ensureObj(Object o) { // NOTE: will throw NullPointerException, as specified, if o is null if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) { throwSetIllegalArgumentException(o); } } private String getQualifiedFieldName() { return field.getDeclaringClass().getName() + "." +field.getName(); } protected IllegalArgumentException newGetIllegalArgumentException(String type) { --- 38,105 ---- memory and loading time for the dynamically-generated FieldAccessors. */ abstract class UnsafeFieldAccessorImpl extends FieldAccessorImpl { static final Unsafe unsafe = Unsafe.getUnsafe(); + private static final int FLATTENABLE = 0x01; + private static final int FLATTENED = 0x10; + private static final int NULLABLE = 0x100; protected final Field field; protected final long fieldOffset; protected final boolean isFinal; ! protected final int flags; UnsafeFieldAccessorImpl(Field field) { this.field = field; if (Modifier.isStatic(field.getModifiers())) ! this.fieldOffset = unsafe.staticFieldOffset(field); else ! this.fieldOffset = unsafe.objectFieldOffset(field); ! this.isFinal = Modifier.isFinal(field.getModifiers()); ! ! int flags = 0; ! if (ReflectionFactory.langReflectAccess().isFlattenable(field)) ! flags |= FLATTENABLE; ! if (ReflectionFactory.langReflectAccess().isFlattened(field)) ! flags |= FLATTENED; ! if (ReflectionFactory.langReflectAccess().isNullable(field)) ! flags |= NULLABLE; ! this.flags = flags; } protected void ensureObj(Object o) { // NOTE: will throw NullPointerException, as specified, if o is null if (!field.getDeclaringClass().isAssignableFrom(o.getClass())) { throwSetIllegalArgumentException(o); } } + protected boolean isFlattenable() { + return (flags & FLATTENABLE) == FLATTENABLE; + } + + protected boolean isFlattened() { + return (flags & FLATTENED) == FLATTENED; + } + + protected boolean isNullable() { + return (flags & NULLABLE) == NULLABLE; + } + + protected Object checkValue(Object value) { + if (!isNullable() && value == null) + throw new NullPointerException(field + " cannot be set to null"); + + if (value != null) { + if (!field.getType().isAssignableFrom(value.getClass())) { + throwSetIllegalArgumentException(value); + } + } + return value; + } + private String getQualifiedFieldName() { return field.getDeclaringClass().getName() + "." +field.getName(); } protected IllegalArgumentException newGetIllegalArgumentException(String type) {
< prev index next >