< prev index next >

src/java.base/share/classes/java/lang/reflect/AccessFlag.java

Print this page
@@ -23,10 +23,13 @@
   * 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;

@@ -160,12 +163,29 @@
       * 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

@@ -262,10 +282,22 @@
       */
      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()

@@ -375,11 +407,11 @@
       * 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

@@ -390,10 +422,36 @@
                      " 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

@@ -408,11 +466,11 @@
           * @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 |

@@ -430,11 +488,11 @@
           * @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))),
  

@@ -472,11 +530,11 @@
           * @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 |

@@ -688,11 +746,10 @@
              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;

@@ -704,14 +761,16 @@
              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 >