странные вещи с btrace и java.lang.NoSuchMethodError

основной класс:

package com.xxx.yyy;

public class Hello{
    public static void main(String[] args){
        A a = new A();
        while(true){
            try {
                a.execute(1000);
                Thread.sleep(1000);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

класс А:

package com.xxx.yyy;

public class A{
    public void execute(int sleepTime) throws Exception {
        System.out.println("sleep time is "+sleepTime); 
    }
}

btrace-скрипт:

import static com.sun.btrace.BTraceUtils.println;  
import static com.sun.btrace.BTraceUtils.str;  
import static com.sun.btrace.BTraceUtils.strcat;  
import static com.sun.btrace.BTraceUtils.timeMillis;  

import com.sun.btrace.annotations.BTrace;  
import com.sun.btrace.annotations.Kind;  
import com.sun.btrace.annotations.Location;  
import com.sun.btrace.annotations.OnMethod;  
import com.sun.btrace.annotations.ProbeClassName;  
import com.sun.btrace.annotations.ProbeMethodName;  
import com.sun.btrace.annotations.TLS;
@BTrace
public class BtraceTest{

    @OnMethod(clazz="com.xxx.yyy.A",method="execute",location=@Location(Kind.RETURN))
    public static void traceExecute(@ProbeClassName String name,@ProbeMethodName String method,int sleepTime){
        println(strcat("the class name=>", name));  
        println(strcat("the class method=>", method));  
        println(strcat("the class method params=>", str(sleepTime)));
    }
}

все верно. НО: когда я перемещаю строку Thread.sleep(1000) в функцию выполнения класса A, например:

package com.xxx.yyy;

public class A{
    public void execute(int sleepTime) throws Exception {
        System.out.println("sleep time is "+sleepTime); 
        Thread.sleep(1000);
    }
}

Hello вызывает NoSuchMethodError.

Exception in thread "main" java.lang.NoSuchMethodError: com.xxx.yyy.A.$btrace$BtraceTest$traceExecute(Ljava/lang/String;Ljava/lang/String;I)V
    at com.xxx.yyy.A.execute(Unknown Source)
    at com.xxx.yyy.Hello.main(Hello.java:8)

моя среда

версия Java "1.8.0_121"
BTrace v.1.3.9 (20170111)

кто-нибудь может объяснить, почему? спасибо!


person anzhilin    schedule 13.11.2017    source источник


Ответы (1)


Я думаю, что ваш класс должен implements Runnable или extends Thread. Только тогда вы сможете использовать start, sleep и тому подобные методы в своей программе. Посмотрите здесь, чтобы узнать, как реализовать методы потока. .

person Previn    schedule 13.11.2017