Class ClassInstrumentor

  • Direct Known Subclasses:
    InvokeDynamicClassInstrumentor

    public class ClassInstrumentor
    extends Object
    Instruments (i.e. modifies the bytecode) of classes to place the scaffolding necessary to use Robolectric's shadows.
    • Constructor Detail

      • ClassInstrumentor

        public ClassInstrumentor()
    • Method Detail

      • instrument

        public void instrument​(MutableClass mutableClass)
      • addDirectCallConstructor

        protected void addDirectCallConstructor​(MutableClass mutableClass)
      • instrumentNormalMethod

        protected void instrumentNormalMethod​(MutableClass mutableClass,
                                              org.objectweb.asm.tree.MethodNode method)
        Instruments a normal method
        • Rename the method from methodName to $$robo$$methodName.
        • Make it private so we can invoke it directly without subclass overrides taking precedence.
        • Remove final modifiers, if present.
        • Create a delegator method named methodName which delegates to the ClassHandler.
      • instrumentNativeMethod

        protected void instrumentNativeMethod​(MutableClass mutableClass,
                                              org.objectweb.asm.tree.MethodNode method)
        Creates native stub which returns the default return value.
        Parameters:
        mutableClass - Class to be instrumented
        method - Method to be instrumented, must be native
      • exceptionArray

        protected String[] exceptionArray​(org.objectweb.asm.tree.MethodNode method)
      • interceptInvokeVirtualMethod

        protected void interceptInvokeVirtualMethod​(MutableClass mutableClass,
                                                    ListIterator<org.objectweb.asm.tree.AbstractInsnNode> instructions,
                                                    org.objectweb.asm.tree.MethodInsnNode targetMethod)
        Decides to call through the appropriate method to intercept the method with an INVOKEVIRTUAL Opcode, depending if the invokedynamic bytecode instruction is available (Java 7+).
      • makeMethodPublic

        protected void makeMethodPublic​(org.objectweb.asm.tree.MethodNode method)
        Replaces protected and private method modifiers with public.
      • makeMethodPrivate

        protected void makeMethodPrivate​(org.objectweb.asm.tree.MethodNode method)
        Replaces protected and public class modifiers with private.