< 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 >