2015-07-28 3 views
1

Приветствия Я хотел бы прочитать данные метода, который я пытаюсь изменить с помощью манипуляции Bytecode с javassist и java-агентом. Причина в том, что моя программа (webApplication) не будет работать (javassist.CannotCompileException: [source error]) is missing what is this?) , и никто не мог мне помочь в данный момент. Так что я не хочу, не то, что внутри моего Methode может быть что-то производит ошибку ... так что я хочу знать, если я могу прочитать и распечатать содержимое CtMethodКак читать данные CtMethod

Мой код

private byte[] transformClass(Class classToTransform, byte[] b, String className) { 
    if (className.startsWith("de/example")) { 

     ClassPool pool = ClassPool.getDefault(); 
     CtClass cl = null; 

     try { 
       cl = pool.makeClass(new ByteArrayInputStream(b)); 

     } catch (IOException e) { 
       e.printStackTrace(); 
     } 


     try { 


      assert cl != null; 
      for (CtMethod ctMethod : cl.getMethods()) { 
       changeMethod(ctMethod); 
       System.out.println(ctMethod.getMethodInfo()); 
       System.out.println(ctMethod.getMethodInfo2()); 
      } 

      b = cl.toBytecode(); 
     } catch (Exception e) { 
      e.printStackTrace(); 

     } finally { 
      if (cl != null) { 
       cl.detach(); 
      } 
     } 
     } 
    return b; 
} 

private void changeMethod(CtMethod method) throws NotFoundException, CannotCompileException { 

    if (method.hasAnnotation(Loggable.class)) { 
    System.out.println(method.getMethodInfo()); 
    System.out.println(method.getMethodInfo2()); 


    method.insertBefore(" startTime = 0;\n" + 
      " startTime = System.currentTimeMillis();\n" + 
      " final de.example.webservice.ws.TestFolder.Logging threadLogger = de.example.webservice.ws.TestFolder.Logging.getInstance();\n" + 
      " Thread thread1 = new Thread(new Runnable(){\n" + 
      "  @Override\n" + 
      "  public void run() {\n" + 
      " threadLogger.info(\"Testlog\");\n" + 
      "  try {\n" + 
      " threadLogger.logCall(Webservice.this.getClass().getMethod(\"startThread0\"),\"Thread\");\n" + 
      "   } catch (Exception e) {\n" + 
      "   e.printStackTrace();\n" + 
      "   }\n" + 
      "   }\n" + 
      "    });\n" + 
      "   thread1.start();"); 

    } 
} 

я только методы в Google, который может читать данные из файлов, таких как .txt-файл, но это не полезно для моей проблемы.

ответ

2

Если вы пытаетесь прочитать исходный источник метода, javassist на самом деле этого не делает. Вам нужен декомпилятор байт-кода java. Google для этого срока. jad - хороший.

+0

Oke спасибо, я решил использовать Java Decompiler IntelliJ Plugin, потому что он новее: D – alovaros

+0

Достаточно. Забыл об этом :) – Nicholas

Смежные вопросы