Class ClassInstrumenter


  • public final class ClassInstrumenter
    extends Object
    This class provides a convenient way to instrument every method in a class. It assumes you are using ShrikeCT to read and write classes. It's stateful; initially every method is set to the original code read from the class, but you can then go in and modify the methods.
    • Method Detail

      • getInputName

        public String getInputName()
        Returns:
        name of resource from which this class was read
      • enableFakeLineNumbers

        public void enableFakeLineNumbers​(int offset)
        Calling this means that methods without line numbers get fake line numbers added: each bytecode instruction is treated as at line 'offset' + the offset of the instruction.
      • getReader

        public ClassReader getReader()
        Returns:
        the reader for the class
      • deleteMethod

        public void deleteMethod​(int i)
        Indicate that the method should be deleted from the class.
        Parameters:
        i - the index of the method to delete
      • resetMethod

        public void resetMethod​(int i)
        Reset method i back to the code from the original class, and "undelete" it if it was marked for deletion.
        Parameters:
        i - the index of the method to reset
      • replaceMethod

        public void replaceMethod​(int i,
                                  MethodData md)
        Replace the code for method i with new code. This also "undeletes" the method if it was marked for deletion.
        Parameters:
        i - the index of the method to replace
        Throws:
        IllegalArgumentException - if md is null
      • isChanged

        public boolean isChanged()
        Check whether any methods in the class have actually been changed.
      • emitClass

        public ClassWriter emitClass()
                              throws InvalidClassFileException
        Create a class which is a copy of the original class but with the new method code. We return the ClassWriter used, so more methods and fields (and other changes) can still be added. We fix up any debug information to be consistent with the changes to the code.
        Throws:
        InvalidClassFileException