< prev index next > src/java.base/share/classes/java/lang/reflect/AccessFlag.java
Print this page
* questions.
*/
package java.lang.reflect;
+ import jdk.internal.javac.PreviewFeature;
+ import jdk.internal.misc.PreviewFeatures;
+
import java.lang.classfile.ClassModel;
import java.lang.classfile.FieldModel;
import java.lang.classfile.MethodModel;
import java.lang.classfile.attribute.InnerClassInfo;
import java.lang.classfile.attribute.MethodParameterInfo;
* 0x0020}.
*
* @apiNote
* In Java SE 8 and above, the JVM treats the {@code ACC_SUPER}
* flag as set in every class file (JVMS {@jvms 4.1}).
+ * If preview feature is enabled,
+ * the {@code 0x0020} access flag bit is {@linkplain #IDENTITY IDENTITY access flag}.
+ */
+ SUPER(0x0000_0020, false,
+ PreviewFeatures.isEnabled() ? Location.EMPTY_SET : Location.SET_CLASS,
+ List.of()),
+
+ /**
+ * The access flag {@code ACC_IDENTITY}, corresponding to the
+ * modifier {@link Modifier#IDENTITY identity}, with a mask
+ * value of <code>{@value "0x%04x" Modifier#IDENTITY}</code>.
+ * @jvms 4.1 -B. Class access and property modifiers
+ *
+ * @since Valhalla
*/
- SUPER(0x0000_0020, false, Location.SET_CLASS, List.of()),
+ @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective=true)
+ IDENTITY(Modifier.IDENTITY, false,
+ PreviewFeatures.isEnabled() ? Location.SET_CLASS_INNER_CLASS : Location.EMPTY_SET,
+ List.of()),
/**
* The module flag {@code ACC_OPEN} with a mask value of {@code
* 0x0020}.
* @see java.lang.module.ModuleDescriptor#isOpen
*/
STRICT(Modifier.STRICT, true, Location.EMPTY_SET,
List.of(Map.entry(RELEASE_16, Location.SET_METHOD),
Map.entry(RELEASE_1, Location.EMPTY_SET))),
+ /**
+ * The access flag {@code ACC_STRICT_INIT}, with a mask
+ * value of {@code 0x0800}.
+ *
+ * @jvms 4.5 Fields
+ * @since Valhalla
+ */
+ @PreviewFeature(feature = PreviewFeature.Feature.VALUE_OBJECTS, reflective=true)
+ STRICT_INIT(Modifier.STRICT, false,
+ PreviewFeatures.isEnabled() ? Location.SET_FIELD : Location.EMPTY_SET,
+ List.of()),
+
/**
* The access flag {@code ACC_SYNTHETIC} with a mask value of
* <code>{@value "0x%04x" Modifier#SYNTHETIC}</code>.
* @see Class#isSynthetic()
* @see Executable#isSynthetic()
* @see ClassModel#flags()
* @see Modifier#classModifiers()
* @see Modifier#interfaceModifiers()
* @jvms 4.1 The {@code ClassFile} Structure
*/
- CLASS(ACC_PUBLIC | ACC_FINAL | ACC_SUPER |
+ CLASS(ACC_PUBLIC | ACC_FINAL | (PreviewFeatures.isEnabled() ? ACC_IDENTITY : ACC_SUPER) |
ACC_INTERFACE | ACC_ABSTRACT |
ACC_SYNTHETIC | ACC_ANNOTATION |
ACC_ENUM | ACC_MODULE,
List.of(Map.entry(RELEASE_8, // no module
ACC_PUBLIC | ACC_FINAL | ACC_SUPER |
* @see Modifier#fieldModifiers()
* @jvms 4.5 Fields
*/
FIELD(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
- ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM,
+ ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM | (PreviewFeatures.isEnabled() ? ACC_STRICT : 0),
List.of(Map.entry(RELEASE_4, // no synthetic, enum
ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
ACC_STATIC | ACC_FINAL | ACC_VOLATILE |
ACC_TRANSIENT))),
* @see InnerClassInfo#flags()
* @see Modifier#classModifiers()
* @see Modifier#interfaceModifiers()
* @jvms 4.7.6 The {@code InnerClasses} Attribute
*/
- INNER_CLASS(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
+ INNER_CLASS(ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | (PreviewFeatures.isEnabled() ? ACC_IDENTITY : ACC_SUPER) |
ACC_STATIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT |
ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM,
List.of(Map.entry(RELEASE_4, // no synthetic, annotation, enum
ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED |
ACC_STATIC | ACC_FINAL | ACC_INTERFACE |
ret[pos] = flag;
}
return ret;
}
- // Will take extra args in the future for valhalla switch
private static AccessFlag[] findDefinition(Location location) {
return switch (location) {
case CLASS -> CLASS_FLAGS;
case FIELD -> FIELD_FLAGS;
case METHOD -> METHOD_FLAGS;
case MODULE_OPENS -> MODULE_OPENS_FLAGS;
};
}
private static final @Stable AccessFlag[] // Can use stable array and lazy init in the future
- CLASS_FLAGS = createDefinition(PUBLIC, FINAL, SUPER, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE),
- FIELD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM),
+ CLASS_FLAGS = createDefinition(PUBLIC, FINAL, (PreviewFeatures.isEnabled() ? IDENTITY : SUPER), INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM, MODULE),
+ FIELD_FLAGS = PreviewFeatures.isEnabled() ? // Using Valhalla
+ createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM, STRICT_INIT) :
+ createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, VOLATILE, TRANSIENT, SYNTHETIC, ENUM),
METHOD_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, SYNCHRONIZED, BRIDGE, VARARGS, NATIVE, ABSTRACT, STRICT, SYNTHETIC),
- INNER_CLASS_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM),
+ INNER_CLASS_FLAGS = createDefinition(PUBLIC, PRIVATE, PROTECTED, (PreviewFeatures.isEnabled() ? IDENTITY : SUPER), STATIC, FINAL, INTERFACE, ABSTRACT, SYNTHETIC, ANNOTATION, ENUM),
METHOD_PARAMETER_FLAGS = createDefinition(FINAL, SYNTHETIC, MANDATED),
MODULE_FLAGS = createDefinition(OPEN, SYNTHETIC, MANDATED),
MODULE_REQUIRES_FLAGS = createDefinition(TRANSITIVE, STATIC_PHASE, SYNTHETIC, MANDATED),
MODULE_EXPORTS_FLAGS = createDefinition(SYNTHETIC, MANDATED),
MODULE_OPENS_FLAGS = createDefinition(SYNTHETIC, MANDATED);
< prev index next >