< prev index next > src/java.base/share/classes/java/lang/reflect/Field.java
Print this page
import java.util.Map;
import java.util.Set;
import java.util.Objects;
import jdk.internal.access.SharedSecrets;
import jdk.internal.event.FinalFieldMutationEvent;
+ import jdk.internal.javac.PreviewFeature;
import jdk.internal.loader.ClassLoaders;
import jdk.internal.misc.VM;
import jdk.internal.module.ModuleBootstrap;
import jdk.internal.module.Modules;
import jdk.internal.reflect.CallerSensitive;
// This is guaranteed to be interned by the VM in the 1.4
// reflection implementation
private final String name;
private final Class<?> type;
private final int modifiers;
! private final boolean trustedFinal;
// Generics and annotations support
private final transient String signature;
private final byte[] annotations;
/**
// This is guaranteed to be interned by the VM in the 1.4
// reflection implementation
private final String name;
private final Class<?> type;
private final int modifiers;
! private final int flags;
// Generics and annotations support
private final transient String signature;
private final byte[] annotations;
/**
@SuppressWarnings("deprecation")
Field(Class<?> declaringClass,
String name,
Class<?> type,
int modifiers,
! boolean trustedFinal,
int slot,
String signature,
byte[] annotations)
{
this.clazz = declaringClass;
this.name = name;
this.type = type;
this.modifiers = modifiers;
! this.trustedFinal = trustedFinal;
this.slot = slot;
this.signature = signature;
this.annotations = annotations;
}
@SuppressWarnings("deprecation")
Field(Class<?> declaringClass,
String name,
Class<?> type,
int modifiers,
! int flags,
int slot,
String signature,
byte[] annotations)
{
this.clazz = declaringClass;
this.name = name;
this.type = type;
this.modifiers = modifiers;
! this.flags = flags;
this.slot = slot;
this.signature = signature;
this.annotations = annotations;
}
// objects be fabricated for each reflective call on Class
// objects.)
if (this.root != null)
throw new IllegalArgumentException("Can not copy a non-root Field");
! Field res = new Field(clazz, name, type, modifiers, trustedFinal, slot, signature, annotations);
res.root = this;
// Might as well eagerly propagate this if already present
res.fieldAccessor = fieldAccessor;
res.overrideFieldAccessor = overrideFieldAccessor;
res.genericInfo = genericInfo;
// objects be fabricated for each reflective call on Class
// objects.)
if (this.root != null)
throw new IllegalArgumentException("Can not copy a non-root Field");
! Field res = new Field(clazz, name, type, modifiers, flags, slot, signature, annotations);
res.root = this;
// Might as well eagerly propagate this if already present
res.fieldAccessor = fieldAccessor;
res.overrideFieldAccessor = overrideFieldAccessor;
res.genericInfo = genericInfo;
}
/**
* {@return an unmodifiable set of the {@linkplain AccessFlag
* access flags} for this field, possibly empty}
+ * The {@code AccessFlags} may depend on the class file format version of the class.
+ *
* @see #getModifiers()
* @jvms 4.5 Fields
* @since 20
*/
@Override
*/
public boolean isSynthetic() {
return Modifier.isSynthetic(getModifiers());
}
+ /**
+ * Returns {@code true} if this field is a strictly
+ * initialized field; returns {@code false} otherwise.
+ *
+ * @return true if and only if this field is a strictly
+ * initialized field as defined by the Java Virtual Machine Specification
+ * @jvms strict-fields-4.5 Field access and property flags
+ * @since Valhalla
+ */
+ @PreviewFeature(feature = PreviewFeature.Feature.STRICT_FIELDS, reflective = true)
+ public boolean isStrictInit() {
+ return accessFlags().contains(AccessFlag.STRICT_INIT);
+ }
+
/**
* Returns a {@code Class} object that identifies the
* declared type for the field represented by this
* {@code Field} object.
*
* open} to the caller's module.</li>
* </ol>
* </li>
* <li>{@code D} is not a {@linkplain Class#isRecord() record class}.</li>
* <li>{@code D} is not a {@linkplain Class#isHidden() hidden class}.</li>
+ * <li>{@code D} is not a {@linkplain Class#isValue() value class}.</li>
* <li>The field is non-static.</li>
* </ul>
*
* <p>If any of the above conditions is not met, this method throws an
* {@code IllegalAccessException}.
@Override
/* package-private */ Field getRoot() {
return root;
}
/* package-private */ boolean isTrustedFinal() {
! return trustedFinal;
}
/**
* {@inheritDoc}
*
@Override
/* package-private */ Field getRoot() {
return root;
}
+ private static final int TRUST_FINAL = 0x0010;
+ private static final int NULL_RESTRICTED = 0x0020;
+
/* package-private */ boolean isTrustedFinal() {
! return (flags & TRUST_FINAL) == TRUST_FINAL;
+ }
+
+ /* package-private */ boolean isNullRestricted() {
+ return (flags & NULL_RESTRICTED) == NULL_RESTRICTED;
}
/**
* {@inheritDoc}
*
< prev index next >