这样可以吗..
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()+"方法的调用中.");
}
}
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()+"方法的调用中.");
}
}
解决方案 »
- 大神急救,关于addWindowListener的一个问题
- 单线程处理方式改为多线程处理方式
- 怎样实现删除多层子目录?
- 为什么无法以“|”作为字符串的分隔标志来使用spli来分隔字符串
- 两个Action之间如何通过HTTP进行通信?
- 初学者的问题,什么是JFC
- jrun 是不是Web server,它们之间何关系啊?可以代替apache的软件是什么 呢?
- 如何在win2000 Server版中配置jdk1.3开发包,谢谢指教!
- 关于字符串截取问题(去掉参数列表中的参数类型,仅仅保留参数名)
- 个人解决牛客网上,剪绳子问题的思路
- FilterInputStream是不是抽象类?
- 那位好心人把bdk发到我的信箱里,多谢了
发生在类:Debug,对Thread[main,5,main]方法的调用中.但是你用的这个方法得到的main指的是主线程(线程名),并不是方法名
:(
System.out.println((new Throwable()).getStackTrace()[0].getMethodName());
即可
System.out.println((new Throwable()).getStackTrace()[0].getMethodName());快结帖啊
过来看一看
这个问题
说实话
就我目前的能力
我没办法解决
除非我理解错了
我的理解是楼主要实现对一个类的方法调用跟踪
也就是一个对象当前走到哪个方法里了
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以上的版本
我在这里并不否认别人的方法
也不打击别人的积极性
只是看了这样的结果感到很疑惑
因为我是应他人之邀来看的
对"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类的实例)