--- old/src/java.base/share/classes/jdk/internal/reflect/UnsafeFieldAccessorImpl.java 2018-07-05 23:11:54.000000000 -0700 +++ new/src/java.base/share/classes/jdk/internal/reflect/UnsafeFieldAccessorImpl.java 2018-07-05 23:11:54.000000000 -0700 @@ -27,6 +27,8 @@ 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 @@ -38,20 +40,31 @@ 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 boolean isFlattened; + protected final int flags; UnsafeFieldAccessorImpl(Field field) { this.field = field; if (Modifier.isStatic(field.getModifiers())) - fieldOffset = unsafe.staticFieldOffset(field); + this.fieldOffset = unsafe.staticFieldOffset(field); else - fieldOffset = unsafe.objectFieldOffset(field); - isFinal = Modifier.isFinal(field.getModifiers()); - isFlattened = ReflectionFactory.langReflectAccess().isFlattened(field); + 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) { @@ -61,6 +74,30 @@ } } + 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(); }