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

@@ -431,11 +463,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 |

@@ -453,11 +485,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))),
  

@@ -495,11 +527,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 : 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 |

@@ -711,11 +743,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;

@@ -727,14 +758,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 >