diff options
author | Raven Szewczyk <git@kubasz.xyz> | 2023-01-24 16:06:42 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-24 17:06:42 +0100 |
commit | 0f46044ba9f95cb732bf2a82e35430e01c72bc1b (patch) | |
tree | e997f3dc0a6333547b24f856a2dd50a3d0c5aa92 /src/main/java/gtPlusPlus/core | |
parent | 7366deae4a0e4404799ab17dfde0a7ba7d4cb54f (diff) | |
download | GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.tar.gz GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.tar.bz2 GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.zip |
Make reflection Java 12+ compatible (#517)
Diffstat (limited to 'src/main/java/gtPlusPlus/core')
-rw-r--r-- | src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java | 67 |
1 files changed, 16 insertions, 51 deletions
diff --git a/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java b/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java index c493ce1aa9..f770cb0e97 100644 --- a/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java +++ b/src/main/java/gtPlusPlus/core/util/reflect/ReflectionUtils.java @@ -1,6 +1,7 @@ package gtPlusPlus.core.util.reflect; import com.google.common.reflect.ClassPath; +import com.gtnewhorizon.gtnhlib.reflect.Fields; import gtPlusPlus.api.objects.Logger; import gtPlusPlus.core.util.data.StringUtils; import java.io.IOException; @@ -20,12 +21,14 @@ import java.util.List; import java.util.Map; import org.apache.commons.lang3.ArrayUtils; +@SuppressWarnings({"unchecked", "rawtypes"}) public class ReflectionUtils { - public static Map<String, Class<?>> mCachedClasses = new LinkedHashMap<String, Class<?>>(); - public static Map<String, CachedMethod> mCachedMethods = new LinkedHashMap<String, CachedMethod>(); - public static Map<String, CachedField> mCachedFields = new LinkedHashMap<String, CachedField>(); - public static Map<String, CachedConstructor> mCachedConstructors = new LinkedHashMap<String, CachedConstructor>(); + public static Map<String, Class<?>> mCachedClasses = new LinkedHashMap<>(); + public static Map<String, CachedMethod> mCachedMethods = new LinkedHashMap<>(); + public static Map<String, CachedField> mCachedFields = new LinkedHashMap<>(); + public static Map<String, CachedConstructor> mCachedConstructors = new LinkedHashMap<>(); + public static Map<Field, Fields.ClassFields.Field> mCachedFieldAccessors = new LinkedHashMap<>(); private static class CachedConstructor { @@ -78,6 +81,11 @@ public class ReflectionUtils { } } + private static Fields.ClassFields.Field cacheAccessor(Field f) { + return mCachedFieldAccessors.computeIfAbsent(f, (field) -> Fields.ofClass(field.getDeclaringClass()) + .getUntypedField(Fields.LookupType.DECLARED_IN_HIERARCHY, field.getName())); + } + private static boolean cacheClass(Class<?> aClass) { if (aClass == null) { return false; @@ -448,29 +456,12 @@ public class ReflectionUtils { @Deprecated public static void setFinalStatic(Field field, Object newValue) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, newValue); + cacheAccessor(field).setValue(null, newValue); } public static void setByte(Object clazz, String fieldName, byte newValue) throws Exception { Field nameField = getField(clazz.getClass(), fieldName); - nameField.setAccessible(true); - int modifiers = nameField.getModifiers(); - Field modifierField = nameField.getClass().getDeclaredField("modifiers"); - modifiers = modifiers & ~Modifier.FINAL; - modifierField.setAccessible(true); - modifierField.setInt(nameField, modifiers); - // Utils.LOG_INFO("O-"+(byte) nameField.get(clazz) + " | "+newValue); - nameField.setByte(clazz, newValue); - // Utils.LOG_INFO("N-"+(byte) nameField.get(clazz)); - - /*final Field fieldA = getField(clazz.getClass(), fieldName); - fieldA.setAccessible(true); - fieldA.setByte(clazz, newValue);*/ - + cacheAccessor(nameField).setValue(null, newValue); } public static boolean invoke(Object objectInstance, String methodName, Class[] parameters, Object[] values) { @@ -808,11 +799,6 @@ public class ReflectionUtils { m = aClass.getDeclaredMethod(aMethodName, aTypes); if (m != null) { m.setAccessible(true); - int modifiers = m.getModifiers(); - Field modifierField = m.getClass().getDeclaredField("modifiers"); - modifiers = modifiers & ~Modifier.FINAL; - modifierField.setAccessible(true); - modifierField.setInt(m, modifiers); } } catch (Throwable t) { Logger.REFLECTION("Method: Internal Lookup Failed: " + aMethodName); @@ -834,11 +820,6 @@ public class ReflectionUtils { c = aClass.getDeclaredConstructor(aTypes); if (c != null) { c.setAccessible(true); - int modifiers = c.getModifiers(); - Field modifierField = c.getClass().getDeclaredField("modifiers"); - modifiers = modifiers & ~Modifier.FINAL; - modifierField.setAccessible(true); - modifierField.setInt(c, modifiers); } } catch (Throwable t) { Logger.REFLECTION("Constructor: Internal Lookup Failed: " + aClass.getName()); @@ -859,14 +840,9 @@ public class ReflectionUtils { Constructor<?> c = aClass.getConstructor(aTypes); if (c != null) { c.setAccessible(true); - int modifiers = c.getModifiers(); - Field modifierField = c.getClass().getDeclaredField("modifiers"); - modifiers = modifiers & ~Modifier.FINAL; - modifierField.setAccessible(true); - modifierField.setInt(c, modifiers); } return c; - } catch (final NoSuchMethodException | IllegalArgumentException | IllegalAccessException e) { + } catch (final NoSuchMethodException | IllegalArgumentException e) { final Class<?> superClass = aClass.getSuperclass(); if (superClass == null || superClass == Object.class) { throw e; @@ -1018,18 +994,7 @@ public class ReflectionUtils { * Set the value of a field reflectively. */ private static void setFieldValue_Internal(Object owner, Field field, Object value) throws Exception { - makeModifiable(field); - field.set(owner, value); - } - - /** - * Force the field to be modifiable and accessible. - */ - private static void makeModifiable(Field nameField) throws Exception { - nameField.setAccessible(true); - Field modifiers = getField(Field.class, "modifiers"); - modifiers.setAccessible(true); - modifiers.setInt(nameField, nameField.getModifiers() & ~Modifier.FINAL); + cacheAccessor(field).setValue(owner, value); } public static boolean doesFieldExist(String clazz, String string) { |