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 | |
parent | 7366deae4a0e4404799ab17dfde0a7ba7d4cb54f (diff) | |
download | GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.tar.gz GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.tar.bz2 GT5-Unofficial-0f46044ba9f95cb732bf2a82e35430e01c72bc1b.zip |
Make reflection Java 12+ compatible (#517)
5 files changed, 35 insertions, 65 deletions
diff --git a/build.gradle b/build.gradle index 2dc32c9f20..505ad92b1a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -//version: 1673027205 +//version: 1674409054 /* DO NOT CHANGE THIS FILE! Also, you may replace this file at any time if there is an update available. @@ -144,6 +144,7 @@ propertyDefaultIfUnset("modrinthProjectId", "") propertyDefaultIfUnset("modrinthRelations", "") propertyDefaultIfUnset("curseForgeProjectId", "") propertyDefaultIfUnset("curseForgeRelations", "") +propertyDefaultIfUnset("minimizeShadowedDependencies", true) String javaSourceDir = "src/main/java/" String scalaSourceDir = "src/main/scala/" @@ -411,7 +412,9 @@ shadowJar { attributes(getManifestAttributes()) } - minimize() // This will only allow shading for actually used classes + if (minimizeShadowedDependencies.toBoolean()) { + minimize() // This will only allow shading for actually used classes + } configurations = [ project.configurations.shadowImplementation, project.configurations.shadowCompile @@ -554,7 +557,9 @@ task shadowDevJar(type: ShadowJar) { attributes(getManifestAttributes()) } - minimize() // This will only allow shading for actually used classes + if (minimizeShadowedDependencies.toBoolean()) { + minimize() // This will only allow shading for actually used classes + } configurations = [ project.configurations.shadowImplementation, project.configurations.shadowCompile diff --git a/dependencies.gradle b/dependencies.gradle index 08b9fb200c..bcdcc706d3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -1,10 +1,11 @@ dependencies { + compile('com.github.GTNewHorizons:GTNHLib:0.0.10:dev') compile('com.github.GTNewHorizons:GT5-Unofficial:5.09.41.232:dev') compile("com.github.GTNewHorizons:StructureLib:1.2.0-beta.2:dev") compile("com.github.GTNewHorizons:ModularUI:1.0.46:dev") {transitive=false} compile("com.github.GTNewHorizons:NotEnoughItems:2.3.20-GTNH:dev") compile('com.github.GTNewHorizons:CodeChickenCore:1.1.7:dev') - compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.6:dev') + compile('com.github.GTNewHorizons:CodeChickenLib:1.1.5.7:dev') compile('net.industrial-craft:industrialcraft-2:2.2.828-experimental:dev') compile('com.github.GTNewHorizons:NewHorizonsCoreMod:1.9.125:dev') diff --git a/src/main/java/gtPlusPlus/GTplusplus.java b/src/main/java/gtPlusPlus/GTplusplus.java index cea985301f..a5e80f5569 100644 --- a/src/main/java/gtPlusPlus/GTplusplus.java +++ b/src/main/java/gtPlusPlus/GTplusplus.java @@ -64,7 +64,7 @@ import net.minecraft.launchwrapper.Launch; name = CORE.name, version = CORE.VERSION, dependencies = - "required-after:Forge; after:TConstruct; after:PlayerAPI; after:dreamcraft; after:IC2; after:ihl; after:psychedelicraft; required-after:gregtech; after:Forestry; after:MagicBees; after:CoFHCore; after:Growthcraft; after:Railcraft; after:CompactWindmills; after:ForbiddenMagic; after:MorePlanet; after:PneumaticCraft; after:ExtraUtilities; after:Thaumcraft; after:rftools; after:simplyjetpacks; after:BigReactors; after:EnderIO; after:tectech; after:GTRedtech; after:beyondrealitycore; after:OpenBlocks; after:IC2NuclearControl; after:TGregworks; after:StevesCarts; after:xreliquary;") + "required-after:Forge; after:TConstruct; after:PlayerAPI; after:dreamcraft; after:IC2; after:ihl; after:psychedelicraft; required-after:gregtech; after:Forestry; after:MagicBees; after:CoFHCore; after:Growthcraft; after:Railcraft; after:CompactWindmills; after:ForbiddenMagic; after:MorePlanet; after:PneumaticCraft; after:ExtraUtilities; after:Thaumcraft; after:rftools; after:simplyjetpacks; after:BigReactors; after:EnderIO; after:tectech; after:GTRedtech; after:beyondrealitycore; after:OpenBlocks; after:IC2NuclearControl; after:TGregworks; after:StevesCarts; after:xreliquary; required-after:gtnhlib@[0.0.10,)") public class GTplusplus implements ActionListener { public static enum INIT_PHASE { 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) { diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/creative/GregtechMetaCreativeEnergyBuffer.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/creative/GregtechMetaCreativeEnergyBuffer.java index 9bfaa40972..d99ff30b20 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/creative/GregtechMetaCreativeEnergyBuffer.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/generators/creative/GregtechMetaCreativeEnergyBuffer.java @@ -2,6 +2,7 @@ package gtPlusPlus.xmod.gregtech.common.tileentities.generators.creative; import static gregtech.api.enums.GT_Values.V; +import com.gtnewhorizon.gtnhlib.reflect.Fields; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; @@ -13,13 +14,10 @@ import gtPlusPlus.api.objects.Logger; import gtPlusPlus.core.lib.CORE; import gtPlusPlus.core.util.math.MathUtils; import gtPlusPlus.core.util.minecraft.PlayerUtils; -import gtPlusPlus.core.util.reflect.ReflectionUtils; import gtPlusPlus.core.util.sys.KeyboardUtils; import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock; import gtPlusPlus.xmod.gregtech.common.blocks.textures.TexturesGtBlock.CustomIcon; import gtPlusPlus.xmod.gregtech.common.tileentities.storage.GregtechMetaEnergyBuffer; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -208,6 +206,8 @@ public class GregtechMetaCreativeEnergyBuffer extends GregtechMetaEnergyBuffer { super.loadNBTData(aNBT); } + private static Fields.ClassFields<GregtechMetaCreativeEnergyBuffer>.Field<ITexture[][][]> mTexturesAccessor; + @Override public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { if (KeyboardUtils.isShiftKeyDown()) { @@ -220,18 +220,17 @@ public class GregtechMetaCreativeEnergyBuffer extends GregtechMetaEnergyBuffer { } this.markDirty(); try { - Field field = ReflectionUtils.getField(this.getClass(), "mTextures"); - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + if (mTexturesAccessor == null) { + mTexturesAccessor = Fields.ofClass(GregtechMetaCreativeEnergyBuffer.class) + .getField(Fields.LookupType.PUBLIC, "mTextures", ITexture[][][].class); + } ITexture[][][] V = getTextureSet(null); if (V != null) { Logger.REFLECTION("Got Valid Textures."); if (this.getBaseMetaTileEntity().isClientSide()) { Logger.REFLECTION("Clientside Call."); Logger.REFLECTION("Refreshing Textures on buffer."); - field.set(this, V); + mTexturesAccessor.setValue(this, V); Logger.REFLECTION("Refreshed Textures on buffer."); } else { Logger.REFLECTION("Serverside Call."); |