< 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()
* appropriate for the location in question}
*
* @param mask bit mask of access flags
* @param location context to interpret mask value
* @throws IllegalArgumentException if the mask contains bit
- * positions not support for the location in question
+ * positions not supported for the location in question
*/
public static Set<AccessFlag> maskToAccessFlags(int mask, Location location) {
var definition = findDefinition(location);
int flagsMask = location.flagsMask();
int parsingMask = location == Location.METHOD ? flagsMask | ACC_STRICT : flagsMask; // flagMask lacks strictfp
" for location " + location);
}
return new AccessFlagSet(definition, mask);
}
+ /**
+ * {@return an unmodifiable set of access flags for the given mask value
+ * appropriate for the location in question}
+ *
+ * @param mask bit mask of access flags
+ * @param location context to interpret mask value
+ * @param cffv the class file format version
+ * @throws IllegalArgumentException if the mask contains bit
+ * positions not supported for the location in question
+ *
+ * @since Valhalla
+ */
+ public static Set<AccessFlag> maskToAccessFlags(int mask, Location location,
+ ClassFileFormatVersion cffv) {
+ var definition = findDefinition(location);
+ int flagsMask = location.flagsMask(cffv);
+ int parsingMask = location == Location.METHOD ? flagsMask | ACC_STRICT : flagsMask; // flagMask lacks strictfp
+ int unmatchedMask = mask & (~parsingMask);
+ if (unmatchedMask != 0) {
+ throw new IllegalArgumentException("Unmatched bit position 0x" +
+ Integer.toHexString(unmatchedMask) +
+ " for location " + location);
+ }
+ return new AccessFlagSet(definition, mask);
+ }
+
/**
* A location within a {@code class} file where flags can be applied.
* <p>
* Note that since these locations represent {@code class} file structures
* rather than language structures, many language structures, such
* @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 : 0) |
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 >