RFR: JDK-8266670: Better modeling of access flags in core reflection [v12]
Peter Levart
plevart at openjdk.java.net
Mon Mar 7 11:26:10 UTC 2022
On Mon, 28 Feb 2022 18:20:13 GMT, ExE Boss <duke at openjdk.java.net> wrote:
>> It does because of the AccessFlags.MODULE constant.
>
>> It does because of the AccessFlags.MODULE constant.
>
> But that’s exactly what the unqualified `MODULE` identifier refers to, and there’s no other bare `MODULE` identifier in scope that would shadow the `AccessFlag.MODULE` constant from the POV of `AccessFlag.LocationToFlags`.
This is just implementation detail, but I think the reverse mapping from Location to AccessFlag(s) could be established implicitly during the initialization of the AccessFlag enum since it is only used from within code of that enum class. Like this:
Index: src/java.base/share/classes/java/lang/reflect/AccessFlag.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java
--- a/src/java.base/share/classes/java/lang/reflect/AccessFlag.java (revision 1498060544413cb67de8b1a82fbbf15d388d62c3)
+++ b/src/java.base/share/classes/java/lang/reflect/AccessFlag.java (date 1646651355828)
@@ -26,8 +26,13 @@
package java.lang.reflect;
import java.util.Collections;
+import java.util.EnumMap;
+import java.util.EnumSet;
+import java.util.HashMap;
import java.util.Map;
import java.util.Set;
+import java.util.function.Function;
+
import static java.util.Map.entry;
/**
@@ -248,6 +253,14 @@
this.mask = mask;
this.sourceModifier = sourceModifier;
this.locations = locations;
+ for (var location : locations) {
+ LocationToFlags.MAP.computeIfAbsent(location, new Function<>() {
+ @Override
+ public Set<AccessFlag> apply(Location location) {
+ return EnumSet.noneOf(AccessFlag.class);
+ }
+ }).add(this);
+ }
}
/**
@@ -283,7 +296,7 @@
*/
public static Set<AccessFlag> maskToAccessFlags(int mask, Location location) {
Set<AccessFlag> result = java.util.EnumSet.noneOf(AccessFlag.class);
- for (var accessFlag : LocationToFlags.locationToFlags.get(location)) {
+ for (var accessFlag : LocationToFlags.MAP.get(location)) {
int accessMask = accessFlag.mask();
if ((mask & accessMask) != 0) {
result.add(accessFlag);
@@ -363,34 +376,7 @@
}
private static class LocationToFlags {
- private static Map<Location, Set<AccessFlag>> locationToFlags =
- Map.ofEntries(entry(Location.CLASS,
- Set.of(PUBLIC, FINAL, SUPER,
- INTERFACE, ABSTRACT,
- SYNTHETIC, ANNOTATION,
- ENUM, AccessFlag.MODULE)),
- entry(Location.FIELD,
- Set.of(PUBLIC, PRIVATE, PROTECTED,
- STATIC, FINAL, VOLATILE,
- TRANSIENT, SYNTHETIC, ENUM)),
- entry(Location.METHOD,
- Set.of(PUBLIC, PRIVATE, PROTECTED,
- STATIC, FINAL, SYNCHRONIZED,
- BRIDGE, VARARGS, NATIVE,
- ABSTRACT, STRICT, SYNTHETIC)),
- entry(Location.INNER_CLASS,
- Set.of(PUBLIC, PRIVATE, PROTECTED,
- STATIC, FINAL, INTERFACE, ABSTRACT,
- SYNTHETIC, ANNOTATION, ENUM)),
- entry(Location.METHOD_PARAMETER,
- Set.of(FINAL, SYNTHETIC, MANDATED)),
- entry(Location.MODULE,
- Set.of(OPEN, SYNTHETIC, MANDATED)),
- entry(Location.MODULE_REQUIRES,
- Set.of(TRANSITIVE, STATIC_PHASE, SYNTHETIC, MANDATED)),
- entry(Location.MODULE_EXPORTS,
- Set.of(SYNTHETIC, MANDATED)),
- entry(Location.MODULE_OPENS,
- Set.of(SYNTHETIC, MANDATED)));
+ private static final Map<Location, Set<AccessFlag>> MAP =
+ new EnumMap<>(Location.class);
}
}
-------------
PR: https://git.openjdk.java.net/jdk/pull/7445
More information about the core-libs-dev
mailing list