-
CSR
-
Resolution: Approved
-
P4
-
None
-
source
-
minimal
-
Changes to preview API has minimal compatibility risk.
-
Java API
-
SE
Summary
Remove error-prone AccessFlags
factories that do not require sufficient information (class-file major version).
Problem
AccessFlags
interpretation is class-file version specific: some flags are invalid in some versions, and we need the version to translate physical flags to logical flags. We cannot create version-specific class files as long as users can create AccessFlags
with bad version assumptions, similar to the trouble of String::toUpperCase
in Turkish locale with i
.
Solution
Remove the 6 factories for AccessFlags
from public API. AccessFlags
is reserved for parsing bit flags given the location + classfile version from the classfile builder context. Users currently can create them implicitly with individual withFlags
methods on classfile builders, which can capture the correct classfile version from builder context.
This API change also allows us to add more APIs to perform version-specific flag parsing (such as inferring valhalla ACC_IDENTITY
flag from older class flags without ACC_SUPER
set) in the future.
Specification
diff --git a/src/java.base/share/classes/java/lang/classfile/AccessFlags.java b/src/java.base/share/classes/java/lang/classfile/AccessFlags.java
index 283094b81d6..6c6ac75e648 100644
--- a/src/java.base/share/classes/java/lang/classfile/AccessFlags.java
+++ b/src/java.base/share/classes/java/lang/classfile/AccessFlags.java
@@ -64,52 +64,4 @@ public sealed interface AccessFlags
* method, or field}
*/
AccessFlag.Location location();
-
- /**
- * {@return an {@linkplain AccessFlags} for a class}
- * @param mask the flags to be set, as a bit mask
- */
- static AccessFlags ofClass(int mask) {
- return new AccessFlagsImpl(AccessFlag.Location.CLASS, mask);
- }
-
- /**
- * {@return an {@linkplain AccessFlags} for a class}
- * @param flags the flags to be set
- */
- static AccessFlags ofClass(AccessFlag... flags) {
- return new AccessFlagsImpl(AccessFlag.Location.CLASS, flags);
- }
-
- /**
- * {@return an {@linkplain AccessFlags} for a field}
- * @param mask the flags to be set, as a bit mask
- */
- static AccessFlags ofField(int mask) {
- return new AccessFlagsImpl(AccessFlag.Location.FIELD, mask);
- }
-
- /**
- * {@return an {@linkplain AccessFlags} for a field}
- * @param flags the flags to be set
- */
- static AccessFlags ofField(AccessFlag... flags) {
- return new AccessFlagsImpl(AccessFlag.Location.FIELD, flags);
- }
-
- /**
- * {@return an {@linkplain AccessFlags} for a method}
- * @param mask the flags to be set, as a bit mask
- */
- static AccessFlags ofMethod(int mask) {
- return new AccessFlagsImpl(AccessFlag.Location.METHOD, mask);
- }
-
- /**
- * {@return an {@linkplain AccessFlags} for a method}
- * @param flags the flags to be set
- */
- static AccessFlags ofMethod(AccessFlag... flags) {
- return new AccessFlagsImpl(AccessFlag.Location.METHOD, flags);
- }
}
- csr of
-
JDK-8337219 AccessFlags factories do not require necessary arguments
-
- Resolved
-
- relates to
-
JDK-8334712 JEP 484: Class-File API
-
- Closed
-