5252import java .lang .reflect .Constructor ;
5353import java .lang .reflect .Field ;
5454import java .lang .reflect .Method ;
55+ import java .lang .reflect .Modifier ;
56+ import java .lang .reflect .ParameterizedType ;
57+ import java .lang .reflect .Type ;
5558import java .util .Arrays ;
59+ import java .util .Map ;
5660import org .bukkit .NamespacedKey ;
5761import org .checkerframework .checker .nullness .qual .NonNull ;
5862
@@ -71,7 +75,7 @@ private MinecraftArgumentTypes() {
7175
7276 private static final Constructor <?> MINECRAFT_KEY_CONSTRUCTOR ;
7377 private static final Method ARGUMENT_REGISTRY_GET_BY_KEY_METHOD ;
74- private static final Field ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD ;
78+ private static final Field BY_CLASS_MAP_FIELD ;
7579
7680 static {
7781 try {
@@ -101,11 +105,20 @@ private MinecraftArgumentTypes() {
101105 .findFirst ().orElseThrow (NoSuchMethodException ::new );
102106 ARGUMENT_REGISTRY_GET_BY_KEY_METHOD .setAccessible (true );
103107
104- Class <?> argumentRegistryEntry = ARGUMENT_REGISTRY_GET_BY_KEY_METHOD .getReturnType ();
105- ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD = Arrays .stream (argumentRegistryEntry .getDeclaredFields ())
106- .filter (field -> field .getType () == Class .class )
107- .findFirst ().orElseThrow (NoSuchFieldException ::new );
108- ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD .setAccessible (true );
108+ BY_CLASS_MAP_FIELD = Arrays .stream (argumentRegistry .getDeclaredFields ())
109+ .filter (field -> Modifier .isStatic (field .getModifiers ()))
110+ .filter (field -> field .getType ().equals (Map .class ))
111+ .filter (field -> {
112+ final ParameterizedType parameterizedType = (ParameterizedType ) field .getGenericType ();
113+ final Type param = parameterizedType .getActualTypeArguments ()[0 ];
114+ if (!(param instanceof ParameterizedType )) {
115+ return false ;
116+ }
117+ return ((ParameterizedType ) param ).getRawType ().equals (Class .class );
118+ })
119+ .findFirst ()
120+ .orElseThrow (NoSuchFieldException ::new );
121+ BY_CLASS_MAP_FIELD .setAccessible (true );
109122 } catch (ReflectiveOperationException e ) {
110123 throw new ExceptionInInitializerError (e );
111124 }
@@ -129,8 +142,13 @@ public static Class<? extends ArgumentType<?>> getClassByKey(
129142 throw new IllegalArgumentException (key .toString ());
130143 }
131144
132- final Class <?> argument = (Class <?>) ARGUMENT_REGISTRY_ENTRY_CLASS_FIELD .get (entry );
133- return (Class <? extends ArgumentType <?>>) argument ;
145+ final Map <Class <?>, Object > map = (Map <Class <?>, Object >) BY_CLASS_MAP_FIELD .get (null );
146+ for (final Map .Entry <Class <?>, Object > mapEntry : map .entrySet ()) {
147+ if (mapEntry .getValue () == entry ) {
148+ return (Class <? extends ArgumentType <?>>) mapEntry .getKey ();
149+ }
150+ }
151+ throw new IllegalArgumentException (key .toString ());
134152 } catch (ReflectiveOperationException e ) {
135153 throw new RuntimeException (e );
136154 }
0 commit comments