Мой javaagent прерывается и ошибки не найдены

Я хочу использовать javaagent и javassist для перехвата времени выполнения метода, однако метод перехвата метода прерывается без ошибок.

Агент:

import java.lang.instrument.Instrumentation;

public class Agent {
public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("in Agent#premain");
         inst.addTransformer(new TimingTransformer());
}}

Трансформатор

public class JassistTiming {
public static byte[] addTiming(String clazz, String mname) throws NotFoundException, CannotCompileException,
        IOException {
    System.out.println("addTiming, clazz: " + clazz);
    CtClass clas = ClassPool.getDefault().get(clazz);
    System.out.println("after get clas: " + clas);
    CtMethod mold = clas.getDeclaredMethod(mname);

    String nname = mname + "$impl";
    mold.setName(nname);
    CtMethod mnew = CtNewMethod.copy(mold, mname, clas, null);

    String type = mold.getReturnType().getName();
    StringBuffer body = new StringBuffer();
    body.append("{\nlong start = System.currentTimeMillis();\n");
    if (!"void".equals(type)) {
        body.append(type + " result = ");
    }
    body.append(nname + "($$);\n");

    body.append("System.out.println(\"Call to method " + mname
            + " took \" +\n (System.currentTimeMillis()-start) + " + "\" ms.\");\n");
    if (!"void".equals(type)) {
        body.append("return result;\n");
    }
    body.append("}");

    mnew.setBody(body.toString());
    clas.addMethod(mnew);
    return clas.toBytecode();
}
}

App.java

class TimeConsume {
public void doSomething(Integer param) {
    try {
        System.out.println("in doSomething...");
        Thread.sleep(param * 1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}
public class App {
public static void main( String[] args ) throws Exception
{
    TimeConsume tc = new TimeConsume();
    tc.doSomething(3);
}}

Выход:

in Agent#premain
in TimingTransformer
addTiming, clazz: demo.design.pattern.TimeConsume
in doSomething...

"после получения класа" не печатается и ошибки нет

1 ответ

Это проблема classpath, я указал classpath, теперь все в порядке

Другие вопросы по тегам