8296743: Tighten Class.getModifiers spec for array classes

Reviewed-by: rriggs, mchung, heidinga
This commit is contained in:
Joe Darcy 2022-11-18 21:51:55 +00:00
parent 3a15e8483c
commit 6fd1442123
3 changed files with 171 additions and 37 deletions

View file

@ -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> its {@code abstract} and {@code final} 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();
@ -1328,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 ABSTRACT} and {@code FINAL} 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