aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gtPlusPlus/core
diff options
context:
space:
mode:
authorRaven Szewczyk <git@kubasz.xyz>2023-01-24 16:06:42 +0000
committerGitHub <noreply@github.com>2023-01-24 17:06:42 +0100
commit0f46044ba9f95cb732bf2a82e35430e01c72bc1b (patch)
treee997f3dc0a6333547b24f856a2dd50a3d0c5aa92 /src/main/java/gtPlusPlus/core
parent7366deae4a0e4404799ab17dfde0a7ba7d4cb54f (diff)
downloadGT5-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.java67
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) {