Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8297237

Tighten Class.getModifiers spec for array classes

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 20
    • core-libs
    • None
    • behavioral
    • low
    • Change spec to match implementation, remove unused implementation flexibility.
    • Java API
    • SE

      Summary

      Update the specification of Class.getModifiers() to match long-standing behavior and remove unnecessary implementation freedom. Make corresponding updates to Class.accessFlags()

      Problem

      The specification of Class.getModifiers() does not fully describe the long standing behavior on JVM-generated class for primitive types are arrays. In addition, unhelpful implementation freedom is allowed to use other bit positions. In the context of anticipated Valhalla changes, tightening the spec of both methods now is useful.

      Solution

      Tighten the spec accordingly.

      Specification

      diff --git a/src/java.base/share/classes/java/lang/Class.java b/src/java.base/share/classes/java/lang/Class.java
      index 116a0a65c96..240945563c5 100644
      --- a/src/java.base/share/classes/java/lang/Class.java
      +++ b/src/java.base/share/classes/java/lang/Class.java
      @@ -1296,17 +1296,21 @@ public final class Class<T> implements java.io.Serializable,
            * {@code abstract} and {@code interface}; they should be decoded
            * using the methods of class {@code Modifier}.
            *
      -     * <p> If the underlying class is an array class, then its
      -     * {@code public}, {@code private} and {@code protected}
      -     * modifiers are the same as those of its component type.  If this
      -     * {@code Class} object represents a primitive type or void, its
      -     * {@code public} modifier is always {@code true}, and its
      -     * {@code protected} and {@code private} modifiers are always
      -     * {@code false}. If this {@code Class} object represents an array class, a
      -     * primitive type or void, then its {@code final} modifier is always
      -     * {@code true} and its interface modifier is always
      -     * {@code false}. The values of its other modifiers are not determined
      -     * by this specification.
      +     * <p> If the underlying class is an array class:
      +     * <ul>
      +     * <li> its {@code public}, {@code private} and {@code protected}
      +     *      modifiers are the same as those of its component type
      +     * <li> * <li> its {@code final} and {@code abstract} modifiers are always
      +     *      {@code true}
      +     * <li> its interface modifier is always {@code false}, even when
      +     *      the component type is an interface
      +     * </ul>
      +     * If this {@code Class} object represents a primitive type or
      +     * void, its {@code public}, {@code abstract}, and {@code final}
      +     * modifiers are always {@code true}.
      +     * For {@code Class} objects representing void, primitive types, and
      +     * arrays, the values of other modifiers are {@code false} other
      +     * than as specified above.
            *
            * <p> The modifier encodings are defined in section {@jvms 4.1}
            * of <cite>The Java Virtual Machine Specification</cite>.
      @@ -1320,6 +1324,7 @@ public final class Class<T> implements java.io.Serializable,
            * @since 1.1
            * @jls 8.1.1 Class Modifiers
            * @jls 9.1.1. Interface Modifiers
      +     * @jvms 4.1 The {@code ClassFile} Structure
            */
           @IntrinsicCandidate
           public native int getModifiers();
      
      @@ -1333,17 +1333,19 @@ public final class Class<T> implements java.io.Serializable,
            * {@return an unmodifiable set of the {@linkplain AccessFlag access
            * flags} for this class, possibly empty}
            *
      -     * <p> If the underlying class is an array class, then its
      -     * {@code PUBLIC}, {@code PRIVATE} and {@code PROTECTED}
      -     * access flags are the same as those of its component type.  If this
      -     * {@code Class} object represents a primitive type or void, the
      -     * {@code PUBLIC} access flag is present, and the
      -     * {@code PROTECTED} and {@code PRIVATE} access flags are always
      -     * absent. If this {@code Class} object represents an array class, a
      -     * primitive type or void, then the {@code FINAL} access flag is always
      -     * present and the interface access flag is always
      -     * absent. The values of its other access flags are not determined
      -     * by this specification.
      +     * <p> If the underlying class is an array class:
      +     * <ul>
      +     * <li> its {@code PUBLIC}, {@code PRIVATE} and {@code PROTECTED}
      +     *      access flags are the same as those of its component type
      +     * <li> its {@code FINAL} and {@code ABSTRACT} flags are present
      +     * <li> its {@code INTERFACE} flag is absent, even when the
      +     *      component type is an interface
      +     * </ul>
      +     *  If this {@code Class} object represents a primitive type or
      +     *  void, the flags are {@code PUBLIC}, {@code ABSTRACT}, and
      +     *  {@code FINAL}.
      +     * For {@code Class} objects representing void, primitive types, and
      +     * arrays, access flags are absent other than as specified above.
            *
            * @see #getModifiers()
            * @jvms 4.1 The ClassFile Structure

            darcy Joe Darcy
            darcy Joe Darcy
            Alan Bateman, Mandy Chung (Inactive), Roger Riggs
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: