title: Error getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class
body: <p>I am stuck in Javassisst. I want to put code in the method that is located in other class. I have "no method" exception. When I just start Test2 class by itself it starts ok, without any errors. I think problem in Classloader because I am trying to invoke methods from SUTTest class in order to conduct assertions and I am trying to do it with Class1 using the same reflection (Javassist). Maybe two classloaders conflict between each other, I have no idea. How I can fix this error?</p>
  
  <p><strong>Class1 - Javassist</strong></p>
  
  <pre><code>ClassPool pool = ClassPool.getDefault();
  CtClass ctAgent = pool.get("Test2");
  CtMethod method = ctAgent.getDeclaredMethod("runTestSamples");
  method.insertAfter("targetClass.getMethod(\"setData\", int.class, int.class).invoke(targetInstance, 9, 2);");
  //  method.insertAt(58, "memoryClassLoader.addDefinition(targetName, instrumented); 
  memoryClassLoader = new MemoryClassLoader();
  targetClass = memoryClassLoader.loadClass(targetName); 
  targetClass.getMethod(\"setData\", int.class, int.class).invoke(targetInstance, 9, 2);");
  ctAgent.toClass();
  new Test2().execute();
  </code></pre>
  
  <p><strong>Class2 - Test2</strong></p>
  
  <pre><code>import java.io.InputStream;
  import java.lang.reflect.InvocationTargetException;
  import java.util.HashMap;
  import java.util.Map;
  import org.jacoco.agent.AgentJar;
  import org.jacoco.core.analysis.Analyzer;
  import org.jacoco.core.analysis.CoverageBuilder;
  import org.jacoco.core.analysis.IClassCoverage;
  import org.jacoco.core.data.ExecutionDataStore;
  import org.jacoco.core.data.SessionInfoStore;
  import org.jacoco.core.instr.Instrumenter;
  import org.jacoco.core.runtime.IRuntime;
  import org.jacoco.core.runtime.LoggerRuntime;
  import org.jacoco.core.runtime.RuntimeData;
  
  public class Test2 {
  
      private Runnable targetInstance;
      public Class&lt;? extends Runnable&gt; targetClass;
      private static HashMap&lt;Integer, String&gt; testSamples;
      private static HashMap&lt;String, Integer&gt; coverageData;
      public String targetName;
      public IRuntime runtime;
      public Instrumenter instr;
      public InputStream original;
      public byte[] instrumented;
      public RuntimeData data;
      public MemoryClassLoader memoryClassLoader;
  
      static Test2 t2 = new Test2();
      int a;
  
      public static void main(String[] args) throws Exception {
          testSamples = new HashMap&lt;Integer, String&gt;();
          coverageData = new HashMap&lt;String, Integer&gt;();
  
          try {
              t2.execute();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  
      public void execute() throws Exception {
          testSamples = new HashMap&lt;Integer, String&gt;();
          coverageData = new HashMap&lt;String, Integer&gt;();
          targetName = SUTClass.class.getName();
          runtime = new LoggerRuntime();
          instr = new Instrumenter(runtime);
          original = getTargetClass(targetName);
          instrumented = instr.instrument(original, targetName);
          original.close();
          data = new RuntimeData();
          runtime.startup(data);
          memoryClassLoader = new MemoryClassLoader();
          memoryClassLoader.addDefinition(targetName, instrumented);
          targetClass = (Class&lt;? extends Runnable&gt;) memoryClassLoader.loadClass(targetName);
          targetClass.getMethod("f", int.class, int.class).invoke(targetInstance, 2, 9);
          runTestSamples(targetClass);
          targetInstance = (Runnable) targetClass.newInstance();
          // Test samples
          targetInstance.run();
          final ExecutionDataStore executionData = new ExecutionDataStore();
          final SessionInfoStore sessionInfos = new SessionInfoStore();
          data.collect(executionData, sessionInfos, false);
          runtime.shutdown();
          final CoverageBuilder coverageBuilder = new CoverageBuilder();
          final Analyzer analyzer = new Analyzer(executionData, coverageBuilder);
          original = getTargetClass(targetName);
          analyzer.analyzeClass(original, targetName);
          original.close();
  
          for (final IClassCoverage cc : coverageBuilder.getClasses()) {
              coverageData.put("coveredInstructions", cc.getInstructionCounter().getCoveredCount());
          }
  
          System.out.println(coverageData.get("coveredInstructions"));
          System.out.println(a);
      }
  
      public static class MemoryClassLoader extends ClassLoader {
          private final Map&lt;String, byte[]&gt; definitions = new HashMap&lt;String, byte[]&gt;();
  
          public void addDefinition(final String name, final byte[] bytes) {
              definitions.put(name, bytes);
          }
  
          @Override
          protected Class&lt;?&gt; loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
              final byte[] bytes = definitions.get(name);
              if (bytes != null) {
                  return defineClass(name, bytes, 0, bytes.length);
              }
              return super.loadClass(name, resolve);
          }
  
      }
  
      private InputStream getTargetClass(final String name) {
          final String resource = '/' + name.replace('.', '/') + ".class";
          return getClass().getResourceAsStream(resource);
      }
  
      public void runTestSamples(Class&lt;? extends Runnable&gt; target)
              throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException,
              SecurityException, ClassNotFoundException {
          targetClass.getMethod("f", int.class, int.class).invoke(targetInstance, 2, 9);
          // testSamples.put(1, "targetClass.getMethod(\"f\", int.class,
          // int.class).invoke(targetInstance, 2, 9)");
          // testSamples.put(2, "targetClass.getMethod(\"d\", int.class,
          // int.class).invoke(targetInstance, 2, 9)");
      }
  }
  </code></pre>
  
  <p><strong>Exception</strong></p>
  
  <pre><code>    javassist.CannotCompileException: [source error] getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class
      at javassist.CtBehavior.insertAfter(CtBehavior.java:909)
      at javassist.CtBehavior.insertAfter(CtBehavior.java:824)
      at Agent3$IdleBehavior.action(Agent3.java:202)
      at jade.core.behaviours.Behaviour.actionWrapper(Behaviour.java:344)
      at jade.core.Agent$ActiveLifeCycle.execute(Agent.java:1585)
      at jade.core.Agent.run(Agent.java:1524)
      at java.lang.Thread.run(Unknown Source)
  Caused by: compile error: getMethod(java.lang.String,java.lang.Class,java.lang.Class) not found in java.lang.Class
      at javassist.compiler.TypeChecker.atMethodCallCore(TypeChecker.java:777)
      at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:723)
      at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:170)
      at javassist.compiler.ast.CallExpr.accept(CallExpr.java:49)
      at javassist.compiler.TypeChecker.atCallExpr(TypeChecker.java:693)
      at javassist.compiler.JvstTypeChecker.atCallExpr(JvstTypeChecker.java:170)
      at javassist.compiler.ast.CallExpr.accept(CallExpr.java:49)
      at javassist.compiler.CodeGen.doTypeCheck(CodeGen.java:266)
      at javassist.compiler.CodeGen.atStmnt(CodeGen.java:360)
      at javassist.compiler.ast.Stmnt.accept(Stmnt.java:53)
      at javassist.compiler.Javac.compileStmnt(Javac.java:578)
      at javassist.CtBehavior.insertAfterAdvice(CtBehavior.java:924)
      at javassist.CtBehavior.insertAfter(CtBehavior.java:883)
      ... 6 more
  </code></pre>
  
  <p><strong>UPDATE</strong></p>
  
  <p>After the solution <code>method.insertAfter("targetClass.getMethod(\"setData\", new Class[] { int.class, int.class }).invoke(targetInstance, new Object[] { 9, 2 });");</code></p>
  
  <p>I have gotten new problem:</p>
  
  <pre><code>    java.lang.VerifyError: Bad type on operand stack
  Exception Details:
    Location:
      Test2.runTestSamples()V @148: aastore
    Reason:
      Type integer (current frame, stack[5]) is not assignable to 'java/lang/Object'
    Current Frame:
      bci: @148
      flags: { }
      locals: { 'Test2', top, null }
      stack: { 'java/lang/reflect/Method', 'java/lang/Runnable', '[Ljava/lang/Object;', '[Ljava/lang/Object;', integer, integer }
    Bytecode:
      0x0000000: 2ab4 002e 12eb 05bd 005d 5903 b200 ed53
      0x0000010: 5904 b200 ed53 b600 f02a b400 2c05 bd00
      0x0000020: 0359 0305 b800 cd53 5904 1009 b800 cd53
      0x0000030: b600 f457 2ab4 002e 1301 3005 bd00 5d59
      0x0000040: 03b2 00ed 5359 04b2 00ed 53b6 00f0 2ab4
      0x0000050: 002c 05bd 0003 5903 1009 b800 cd53 5904
      0x0000060: 05b8 00cd 53b6 00f4 57a7 0003 014d 2ab4
      0x0000070: 002e 1301 3005 bd00 5d59 03b2 00ed 5359
      0x0000080: 04b2 00ed 53b6 00f0 2ab4 002c 05bd 0003
      0x0000090: 5903 1009 5359 0405 53b6 00f4 57b1     
    Stackmap Table:
      same_frame_extended(@108)
  </code></pre>