Class ObfuscationReflectionHelper


  • public class ObfuscationReflectionHelper
    extends java.lang.Object
    Some reflection helper code. This may not work properly in Java 9 with its new, more restrictive, reflection management. As such, if issues are encountered, please report them and we can see what we can do to expand the compatibility. In other cases, AccessTransformers may be used. All field and method names should be passed in as SRG names, and this will automatically resolve if MCP mappings are detected.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private static org.apache.logging.log4j.Logger LOGGER  
      private static org.apache.logging.log4j.Marker REFLECTION  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static <T> java.lang.reflect.Constructor<T> findConstructor​(java.lang.Class<T> clazz, java.lang.Class<?>... parameterTypes)
      Finds a constructor with the specified parameter types in the given class and makes it accessible.
      static <T> java.lang.reflect.Field findField​(java.lang.Class<? super T> clazz, java.lang.String fieldName)
      Finds a field with the specified name in the given class and makes it accessible.
      static java.lang.reflect.Method findMethod​(java.lang.Class<?> clazz, java.lang.String methodName, java.lang.Class<?>... parameterTypes)
      Finds a method with the specified name and parameters in the given class and makes it accessible.
      static <T,​E>
      T
      getPrivateValue​(java.lang.Class<? super E> classToAccess, E instance, java.lang.String fieldName)
      Gets the value a field with the specified name in the given class.
      static java.lang.String remapName​(cpw.mods.modlauncher.api.INameMappingService.Domain domain, java.lang.String name)
      Remaps a name using the SRG naming function
      static <T,​E>
      void
      setPrivateValue​(java.lang.Class<? super T> classToAccess, T instance, E value, java.lang.String fieldName)
      Sets the value a field with the specified name in the given class.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • LOGGER

        private static final org.apache.logging.log4j.Logger LOGGER
      • REFLECTION

        private static final org.apache.logging.log4j.Marker REFLECTION
    • Constructor Detail

      • ObfuscationReflectionHelper

        public ObfuscationReflectionHelper()
    • Method Detail

      • remapName

        @Nonnull
        public static java.lang.String remapName​(cpw.mods.modlauncher.api.INameMappingService.Domain domain,
                                                 java.lang.String name)
        Remaps a name using the SRG naming function
        Parameters:
        domain - The INameMappingService.Domain to use to remap the name.
        name - The name to try and remap.
        Returns:
        The remapped name, or the original name if it couldn't be remapped.
      • getPrivateValue

        @Nullable
        public static <T,​E> T getPrivateValue​(java.lang.Class<? super E> classToAccess,
                                                    E instance,
                                                    java.lang.String fieldName)
        Gets the value a field with the specified name in the given class. Note: For performance, use findField(Class, String) if you are getting the value more than once.

        Throws an exception if the field is not found or the value of the field cannot be gotten.

        Type Parameters:
        T - The type of the value.
        E - The type of the classToAccess.
        Parameters:
        classToAccess - The class to find the field on.
        instance - The instance of the classToAccess.
        fieldName - The SRG (unmapped) name of the field to find (e.g. "field_181725_a").
        Returns:
        The value of the field with the specified name in the classToAccess.
        Throws:
        ObfuscationReflectionHelper.UnableToAccessFieldException - If there was a problem getting the field.
        ObfuscationReflectionHelper.UnableToAccessFieldException - If there was a problem getting the value.
      • setPrivateValue

        public static <T,​E> void setPrivateValue​(@Nonnull
                                                       java.lang.Class<? super T> classToAccess,
                                                       @Nonnull
                                                       T instance,
                                                       @Nullable
                                                       E value,
                                                       @Nonnull
                                                       java.lang.String fieldName)
        Sets the value a field with the specified name in the given class. Note: For performance, use findField(Class, String) if you are setting the value more than once.

        Throws an exception if the field is not found or the value of the field cannot be set.

        Type Parameters:
        T - The type of the value.
        E - The type of the classToAccess.
        Parameters:
        classToAccess - The class to find the field on.
        instance - The instance of the classToAccess.
        value - The new value for the field
        fieldName - The name of the field in the classToAccess.
        Throws:
        ObfuscationReflectionHelper.UnableToFindFieldException - If there was a problem getting the field.
        ObfuscationReflectionHelper.UnableToAccessFieldException - If there was a problem setting the value of the field.
      • findMethod

        @Nonnull
        public static java.lang.reflect.Method findMethod​(@Nonnull
                                                          java.lang.Class<?> clazz,
                                                          @Nonnull
                                                          java.lang.String methodName,
                                                          @Nonnull
                                                          java.lang.Class<?>... parameterTypes)
        Finds a method with the specified name and parameters in the given class and makes it accessible. Note: For performance, store the returned value and avoid calling this repeatedly.

        Throws an exception if the method is not found.

        Parameters:
        clazz - The class to find the method on.
        methodName - The SRG (unmapped) name of the method to find (e.g. "func_12820_D").
        parameterTypes - The parameter types of the method to find.
        Returns:
        The method with the specified name and parameters in the given class.
        Throws:
        java.lang.NullPointerException - If clazz is null.
        java.lang.NullPointerException - If methodName is null.
        java.lang.IllegalArgumentException - If methodName is empty.
        java.lang.NullPointerException - If parameterTypes is null.
        ObfuscationReflectionHelper.UnableToFindMethodException - If the method could not be found.
      • findConstructor

        @Nonnull
        public static <T> java.lang.reflect.Constructor<T> findConstructor​(@Nonnull
                                                                           java.lang.Class<T> clazz,
                                                                           @Nonnull
                                                                           java.lang.Class<?>... parameterTypes)
        Finds a constructor with the specified parameter types in the given class and makes it accessible. Note: For performance, store the returned value and avoid calling this repeatedly.

        Throws an exception if the constructor is not found.

        Type Parameters:
        T - The type.
        Parameters:
        clazz - The class to find the constructor in.
        parameterTypes - The parameter types of the constructor.
        Returns:
        The constructor with the specified parameters in the given class.
        Throws:
        java.lang.NullPointerException - If clazz is null.
        java.lang.NullPointerException - If parameterTypes is null.
        ObfuscationReflectionHelper.UnknownConstructorException - If the constructor could not be found.
      • findField

        @Nonnull
        public static <T> java.lang.reflect.Field findField​(@Nonnull
                                                            java.lang.Class<? super T> clazz,
                                                            @Nonnull
                                                            java.lang.String fieldName)
        Finds a field with the specified name in the given class and makes it accessible. Note: For performance, store the returned value and avoid calling this repeatedly.

        Throws an exception if the field is not found.

        Type Parameters:
        T - The type.
        Parameters:
        clazz - The class to find the field on.
        fieldName - The SRG (unmapped) name of the field to find (e.g. "field_181725_a").
        Returns:
        The constructor with the specified parameters in the given class.
        Throws:
        java.lang.NullPointerException - If clazz is null.
        java.lang.NullPointerException - If fieldName is null.
        java.lang.IllegalArgumentException - If fieldName is empty.
        ObfuscationReflectionHelper.UnableToFindFieldException - If the field could not be found.