-
CSR
-
Resolution: Approved
-
P4
-
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
- csr of
-
JDK-8296743 Tighten Class.getModifiers spec for array classes
-
- Resolved
-