0 Replies Latest reply on Aug 19, 2006 2:58 PM by panzer_kavalier

    NewExpr Error!!!!

    panzer_kavalier

      public class Test implements Runnable{


      public Test(){
      Thread t = new Thread(this);
      t.start();
      }
      public void run(){
      System.out.println("run");
      }


      /**
      * @param args
      */
      public static void main(String[] args) {

      Test test = new Test();

      }


      }
      -----------------------------------------------------------------------------
      public class EmulatorThread implements Runnable{

      public Runnable _target;


      public EmulatorThread(Runnable target) {

      _target = target;
      }


      protected void start(){
      (new Thread(this)).start();
      }

      public void run()
      {
      if(_target != null)
      _target.run();
      }
      }

      ---------------------------------------
      public class MethodSetEditor extends ExprEditor {

      public void edit(NewExpr m) throws CannotCompileException{
      try{


      if (m.getConstructor().getDeclaringClass().getName()
      .equals("java.lang.Thread")) {
      if (m.getConstructor().getSignature().equals(
      "(Ljava/lang/Runnable;)V")) {
      m.replace("{$_ = new EmulatorThread($1);}");
      }
      }
      }
      catch(Exception e){
      e.printStackTrace();
      }
      }

      }

      -----------------------------------------
      when I use the folowing codes to modify the above code:
      ClassPool pool = ClassPool.getDefault();

      try{
      pool.appendClassPath("D:\\eclipse\\workspace\\Javassist\\");

      CtClass cc = pool.makeClass(new FileInputStream("D:\\eclipse\\workspace\\Javassist\\Test.class"));

      CtField [] cts = cc.getFields();
      for(int i = 0; i < cts.length; i++){
      if(cts.getSignature().equals("Ljava/lang/Thread;"))
      cts
      .setType(pool.makeClass("EmulatorThread"));
      }

      cc.instrument(new MethodSetEditor());

      cc.writeFile("E:\\");
      }
      catch(Exception e){
      e.printStackTrace();
      }

      when I run the Test. the following error occured:
      Exception in thread "main" java.lang.VerifyError: (class: Test, method: s
      ignature: ()V) Incompatible object argument for function call