Class EnhanceUtils


  • public final class EnhanceUtils
    extends java.lang.Object
    Utility class for bytecode enhancement using ASM. ASM operates around two basic pieces of information about any type.
    • ASM class name (ACN) : this is the normal fully qualified class name but replacing the dots with slashes. So java.lang.String will have an ASM class name of "java/lang/String".
    • Class Descriptor (CD) : this is used where a type is referred to in a calling sequence etc. and for object types is typically things like "Ljava.lang.String;", but there are variants for primitives.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static java.lang.String ACN_boolean
      ASM class name for boolean.
      static java.lang.String ACN_Boolean
      ASM class name for Boolean.
      static java.lang.String ACN_byte
      ASM class name for byte.
      static java.lang.String ACN_Byte
      ASM class name for Byte.
      static java.lang.String ACN_char
      ASM class name for char.
      static java.lang.String ACN_Character
      ASM class name for Character.
      static java.lang.String ACN_double
      ASM class name for double.
      static java.lang.String ACN_Double
      ASM class name for Double.
      static java.lang.String ACN_float
      ASM class name for float.
      static java.lang.String ACN_Float
      ASM class name for Float.
      static java.lang.String ACN_int
      ASM class name for int.
      static java.lang.String ACN_Integer
      ASM class name for Integer.
      static java.lang.String ACN_long
      ASM class name for long.
      static java.lang.String ACN_Long
      ASM class name for Long.
      static java.lang.String ACN_Object
      ASM class name for java.lang.Object.
      static java.lang.String ACN_short
      ASM class name for short.
      static java.lang.String ACN_Short
      ASM class name for Short.
      static java.lang.String ACN_String
      ASM class name for java.lang.String.
      static java.lang.String CD_Object
      Descriptor for java.lang.Object.
      static java.lang.String CD_String
      Class descriptor for String.
    • Constructor Summary

      Constructors 
      Modifier Constructor Description
      private EnhanceUtils()
      private constructor to prevent instantiation.
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static void addBIPUSHToMethod​(MethodVisitor visitor, int i)
      Convenience method to add a BIPUSH-type int to the visitor.
      static void addLoadForType​(MethodVisitor visitor, java.lang.Class type, int number)
      Convenience method to add a load statement based on the type to be loaded.
      static void addReturnForType​(MethodVisitor visitor, java.lang.Class type)
      Convenience method to add a return statement based on the type to be returned.
      static java.lang.String getASMClassNameForSingleFieldIdentityConstructor​(java.lang.Class fieldType)
      Convenience method to return the ASM class name to use as input via the SingleFieldIdentity constructor.
      static int getAsmVersionForJRE()  
      static java.lang.String getTypeDescriptorForEnhanceMethod​(java.lang.Class cls)
      Convenience method to give the descriptor for use in an enhanced "field" method.
      static java.lang.String getTypeDescriptorForType​(java.lang.String clsName)
      Return the ASM type descriptor for the input class.
      static java.lang.String getTypeNameForPersistableMethod​(java.lang.Class cls)
      Convenience method to give the type name given the type.
      • Methods inherited from class java.lang.Object

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

      • ACN_boolean

        public static final java.lang.String ACN_boolean
        ASM class name for boolean.
      • ACN_byte

        public static final java.lang.String ACN_byte
        ASM class name for byte.
      • ACN_char

        public static final java.lang.String ACN_char
        ASM class name for char.
      • ACN_double

        public static final java.lang.String ACN_double
        ASM class name for double.
      • ACN_float

        public static final java.lang.String ACN_float
        ASM class name for float.
      • ACN_int

        public static final java.lang.String ACN_int
        ASM class name for int.
      • ACN_long

        public static final java.lang.String ACN_long
        ASM class name for long.
      • ACN_short

        public static final java.lang.String ACN_short
        ASM class name for short.
      • ACN_Boolean

        public static final java.lang.String ACN_Boolean
        ASM class name for Boolean.
      • ACN_Byte

        public static final java.lang.String ACN_Byte
        ASM class name for Byte.
      • ACN_Character

        public static final java.lang.String ACN_Character
        ASM class name for Character.
      • ACN_Double

        public static final java.lang.String ACN_Double
        ASM class name for Double.
      • ACN_Float

        public static final java.lang.String ACN_Float
        ASM class name for Float.
      • ACN_Integer

        public static final java.lang.String ACN_Integer
        ASM class name for Integer.
      • ACN_Long

        public static final java.lang.String ACN_Long
        ASM class name for Long.
      • ACN_Short

        public static final java.lang.String ACN_Short
        ASM class name for Short.
      • ACN_String

        public static final java.lang.String ACN_String
        ASM class name for java.lang.String.
      • ACN_Object

        public static final java.lang.String ACN_Object
        ASM class name for java.lang.Object.
      • CD_String

        public static final java.lang.String CD_String
        Class descriptor for String.
      • CD_Object

        public static final java.lang.String CD_Object
        Descriptor for java.lang.Object.
    • Constructor Detail

      • EnhanceUtils

        private EnhanceUtils()
        private constructor to prevent instantiation.
    • Method Detail

      • addBIPUSHToMethod

        public static void addBIPUSHToMethod​(MethodVisitor visitor,
                                             int i)
        Convenience method to add a BIPUSH-type int to the visitor.
        Parameters:
        visitor - The MethodVisitor
        i - number
      • addReturnForType

        public static void addReturnForType​(MethodVisitor visitor,
                                            java.lang.Class type)
        Convenience method to add a return statement based on the type to be returned.
        Parameters:
        visitor - The MethodVisitor
        type - The type to return
      • addLoadForType

        public static void addLoadForType​(MethodVisitor visitor,
                                          java.lang.Class type,
                                          int number)
        Convenience method to add a load statement based on the type to be loaded.
        Parameters:
        visitor - The MethodVisitor
        type - The type to load
        number - Number to load
      • getTypeNameForPersistableMethod

        public static java.lang.String getTypeNameForPersistableMethod​(java.lang.Class cls)
        Convenience method to give the type name given the type. This is for the assorted methods on the StateManager called things like "replacingStringField", "replacingObjectField", "providedIntField", etc. Just returns the "type" part of the name.
        • Boolean, bool : returns "Boolean"
        • Byte, byte : returns "Byte"
        • Character, char : returns "Char"
        • Double, double : returns "Double"
        • Float, float : returns "Float"
        • Integer, int : returns "Int"
        • Long, long : returns "Long"
        • Short, short : returns "Short"
        • String : returns "String"
        • all others : returns "Object"
        Parameters:
        cls - The type of the field
        Returns:
        Name for the method
      • getTypeDescriptorForType

        public static java.lang.String getTypeDescriptorForType​(java.lang.String clsName)
        Return the ASM type descriptor for the input class.
        Parameters:
        clsName - The input class name
        Returns:
        The ASM type descriptor name
      • getTypeDescriptorForEnhanceMethod

        public static java.lang.String getTypeDescriptorForEnhanceMethod​(java.lang.Class cls)
        Convenience method to give the descriptor for use in an enhanced "field" method. This is for the assorted methods on the StateManager called things like "replacingStringField", "replacingObjectField", "providedIntField", etc. Returns the ASM descriptor equivalent for the method used
        • Boolean, bool : returns "Boolean"
        • Byte, byte : returns "Byte"
        • Character, char : returns "Char"
        • Double, double : returns "Double"
        • Float, float : returns "Float"
        • Integer, int : returns "Int"
        • Long, long : returns "Long"
        • Short, short : returns "Short"
        • String : returns "String"
        • all others : returns "Object"
        TODO Cache these descriptors/classes etc
        Parameters:
        cls - The type of the field
        Returns:
        Name for the method
      • getASMClassNameForSingleFieldIdentityConstructor

        public static java.lang.String getASMClassNameForSingleFieldIdentityConstructor​(java.lang.Class fieldType)
        Convenience method to return the ASM class name to use as input via the SingleFieldIdentity constructor. Means that if the fieldType is primitive we return the ASM class name of the object wrapper.
        Parameters:
        fieldType - Type of the field
        Returns:
        ASM class name to use as input in the constructor
      • getAsmVersionForJRE

        public static int getAsmVersionForJRE()