这样可以吗..
import java.util.*;
//Debug.java文件
import java.lang.reflect.*;
public class Debug {
   public static void debug(Object o){
    Class oClass;
   String className;
   Thread methodName;
   oClass = o.getClass();
   className = oClass.getName();   methodName = Thread.currentThread();
   System.out.println("发生在类:"+className+",对"+methodName.getName()+"方法的调用中.");
  }
}

解决方案 »

  1.   

    刚才试了一下,得到的是:
    发生在类:Debug,对Thread[main,5,main]方法的调用中.但是你用的这个方法得到的main指的是主线程(线程名),并不是方法名
    :(
      

  2.   

    这个问题可不简单,问这个问题的人将来一定回成为高手reflect包是一个性能杀手,尽量不要使用,用这个方法也解决不料这个问题JDK1。4比较费事JDK1。4中你这样:
    System.out.println((new Throwable()).getStackTrace()[0].getMethodName());
    即可
      

  3.   

    哦,错了是JDK1。4以前比较费事,JDK1。4以前需要产生一个异常,将追踪堆栈输出到内存中的一个缓冲区,然后从这些追踪信息中找出你需要的信息
      

  4.   

    搞什么鬼啊,分都是我的,不过,也可以分给你们一点点
    System.out.println((new Throwable()).getStackTrace()[0].getMethodName());快结帖啊
      

  5.   

    不好意识,这2天忙着找工作,不过按 "iamwls(我想天是我)"的方法的确可行,up的给10分吧,其他的都给"iamwls(我想天是我)"
      

  6.   

    sorry,忘记给"BNickcour(程痴) "分了,毕竟你也用了功的,再次sorry to "BNickcour(程痴) "
      

  7.   

    应别人之邀
    过来看一看
    这个问题
    说实话
    就我目前的能力
    我没办法解决
    除非我理解错了
    我的理解是楼主要实现对一个类的方法调用跟踪
    也就是一个对象当前走到哪个方法里了
    Debug类的debug方法都能显示出当前所在的位置
    就象各种编译器的调式工具一样
    能查到目前所调用的函数方法
    甚至变量的状态值
    比如
    public class TestDebug {
      public TestDebug() {
      
      }
      public void oneMethod() {
        //do something hear
      }
      public void otherMethod() {
        //do somethig hear
      }
      public static void main(String[] args) {
        TestDebug td = new TestDebug();
        Debug.debug(td);
        td.oneMethod();
        td.otherMethod();
      }
    }
    这时
    应该打印出
      发生在类TestDebug,对main方法的调用中.
      发生在类TestDebug,对oneMethod方法的调用中.
      发生在类TestDebug,对otherMethod方法的调用中.
    如果真是这样
    确实很难
    不过看了上面的答案
    真有点疑惑
    楼主的想法好象并不是这样
    但又把问题复杂化了
    import java.lang.reflect.*;
    public class Debug {
       public static void debug(Object o){
        Class oClass;
       String className;
       String methodName;
       oClass = o.getClass();
       className = oClass.getName();
       methodName = //<此处代码是向各位请教的地方>
       //如果不象我想的那样,此处代码为什么不直接写methodName = "main"
       //或者Method[] methods = oClass.getDeclaredMethods();
       //methodName = methods[0].getName();
       System.out.println("发生在类:"+className+",对"+methodName+"方法的调用中.");    
      }
    }
    还有
    我对System.out.println((new Throwable()).getStackTrace()[0].getMethodName());
    这个方法表示怀疑
    System.out.println((new Throwable()).getStackTrace()[0].getMethodName());是不是只能放在TestDebug类的main方法中
    放在Debug类的debug方法中恐怕不行吧
    如果在Debug类的debug方法中
    我估计最后的打印结果将是
      发生在类TestDebug,对debug方法的调用中.
    是不是呢
    可以去试试
    而且这种方法也只用用于java1.4以上的版本
    我在这里并不否认别人的方法
    也不打击别人的积极性
    只是看了这样的结果感到很疑惑
    因为我是应他人之邀来看的
      

  8.   


    对"qybao(阿宝)"的问题我做如下解释:提出这个问题的动机:
    我一直在用jbuilder7,8,9(以下简称jb)做java开发,用jb调试程序时(实际上任何时候都一样),如果有异常就会有一连窜的信息出现比如:
    java.lang.Exception
    at debug.Debug.debug(Debug.java:22)
    at debug.TestDebug.test(TestDebug.java:15)
    at debug.TestDebug.<init>(TestDebug.java:7)
    at debug.TestDebug.main(TestDebug.java:10)
    Exception in thread "main"
    其中:debug.Debug.debug(Debug.java:22)就是异常发生的地方(说明:此信息指出异常发生在debug包中Debug类的debug方法中,并说明异常代码在Debug.java文件的第22行),
    当然这些输出只会当异常发生的时候才有,而我有时在调试代码的时候需要知道某个变量在运行时的值,
    如果手工在程序中到处写System.out.println("发生在类:"+<类名>+",对"+<方法名>+"方法的调用中,变量x="+<变量名>);是会把我累死的,这样不算最坏的(假如在提交代码前没有把这些东西删除干净,就会被别人骂的狗血淋头了),
    所以我才希望知道当前运行的代码执行到哪个类的哪个方法,然后再写一个boolean来控制是否输出这些显示就ok了,这就是我提出这个问题的由来(当然我对此问题作了简化).总结,下面是完整并经过测试的代码和输出(也是我最终想到达的目的,如有错误请各位不吝赐教)
    //Debug.java
    package debug;import java.lang.reflect.*;
    /**
     * 自定义的debug工具类
     * <p>Title: debug工具类</p>
     * <p>Description: 用来输出运行中变量的值和所在的位置</p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public class Debug {  private static final boolean isDebug = true;
      private static void debug(Object o) {    Class oClass;
        String className;
        String methodName;    oClass = o.getClass();
        className = oClass.getName();
        Object p[] = new Throwable().getStackTrace();
        methodName = p[2].toString();    System.out.print("发生在类:" + className + ",对方法:"
                         + methodName + "的调用中,变量:");    //System.out.println((new Throwable()).getStackTrace()[0].getMethodName());//输出:debug
      }  /**
       * 当参数为byte时使用
       * @param o:调用者的实例对象
       * @param name:byte的变量名
       * @param b:要显示byte的数值
       */
      public static void debug(Object o, String name, byte b) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + b);
      }  /**
       * 当参数为short时使用
       * @param o:调用者的实例对象
       * @param name:short的变量名
       * @param s:要显示short的数值
       */
      public static void debug(Object o, String name, short s) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + s);
      }  /**
       * 当参数为int时使用
       * @param o:调用者的实例对象
       * @param name:int的变量名
       * @param i:要显示int的数值
       */
      public static void debug(Object o, String name, int i) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + i);
      }  /**
       * 当参数为char时使用
       * @param o:调用者的实例对象
       * @param name:char的变量名
       * @param c:要显示char的数值
       */
      public static void debug(Object o, String name, char c) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + c);
      }  /**
       * 当参数为boolean时使用
       * @param o:调用者的实例对象
       * @param name:boolean的变量名
       * @param b:要显示boolean的数值
       */
      public static void debug(Object o, String name, boolean b) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + b);
      }  /**
       * 当参数为float时使用
       * @param o:调用者的实例对象
       * @param name:float的变量名
       * @param f:要显示float的数值
       */
      public static void debug(Object o, String name, float f) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + f);
      }  /**
       * 当参数为double时使用
       * @param o:调用者的实例对象
       * @param name:double的变量名
       * @param d:要显示double的数值
       */
      public static void debug(Object o, String name, double d) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + d);
      }  /**
       * 当参数为Object时使用
       * @param o:调用者的实例对象
       * @param name:Object的变量名
       * @param var:要显示的Object对象
       */
      public static void debug(Object o, String name, Object var) {
        if (isDebug == false)      return;
        debug(o);
        System.out.println(name + "=" + var+"(是"+var.getClass()+"类的实例)");
      }}
    //TestDebug.javapackage debug;/**
     * debug工具的测试类
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2003</p>
     * <p>Company: </p>
     * @author not attributable
     * @version 1.0
     */
    public class TestDebug {
      
      public static void main(String[] args) {
        TestDebug td = new TestDebug();
        td.test();
      }  private void test(){
        int i = 8;
        long l = 3423l;
        String s = "Hello test";
         Debug.debug(this,"i",i);
         Debug.debug(this,"l",l);
         Debug.debug(this,"s",s);
      }
    }运行的输出是:
    发生在类:debug.TestDebug,对方法:debug.TestDebug.test(TestDebug.java:26)的调用中,变量:i=8
    发生在类:debug.TestDebug,对方法:debug.TestDebug.test(TestDebug.java:27)的调用中,变量:l=3423.0
    发生在类:debug.TestDebug,对方法:debug.TestDebug.test(TestDebug.java:28)的调用中,变量:s=Hello test(是class java.lang.String类的实例)