论坛首页 Java企业应用论坛

问个问题:如何知道方法的调用者

浏览 34836 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-05-24  
活学活用
public interface Loggable {
	public static Logger log = Logger.getLogger(sun.reflect.Reflection.getCallerClass(2););;
}


public class TestLog implements Loggable {
	public static void main(String[] args);
	{
		log.info("test");;
	}
}

省却了每个类注册Logger重复的代码,不过可能有点badsmell,呵呵
0 请登录后投票
   发表时间:2005-05-25  
楼上好方法,可以不用传类做参数了
0 请登录后投票
   发表时间:2005-05-26  
我用了这个

sun.reflect.Reflection().getCallerClass( int p0);

其中  当p0 = 0 时,表示sun.reflect.Reflection
当p0=1 表示 类本省
当p0=2 表示 调人者

。。。


可是我想,如果要知道是哪个方法就好了,因为他只返回类名阿
0 请登录后投票
   发表时间:2005-05-31  
结合一下上面两位(myy和zzeric)的代码.就可以得到了:
public interface Loggable {
	StackTraceElement stack[] = (new Throwable(););.getStackTrace();;
	StackTraceElement ste = stack[1];
	public static Logger log = Logger.getLogger("Class:"+ste.getClassName(); + "      Method:"
			+ ste.getMethodName();+"  :"+ste.getLineNumber(););;
}

类名,方法名,行数。呵呵
不过buaawhl的回复是从原理上来分析的,很有价值啊。
1 请登录后投票
   发表时间:2005-05-31  
对于log4j来说,Method和行数通过配置properties就可以达到了,而你这样得到的Method和行数并不准确。

public static Logger log = Logger.getLogger("Class:"+ste.getClassName(); + "      Method:" 
                        + ste.getMethodName();+"  :"+ste.getLineNumber(););; 

做为static变量的log在初始化时竟然可以使用non-static的成员变量ste,有点不可思议。
0 请登录后投票
   发表时间:2005-05-31  
多谢了myy!
0 请登录后投票
   发表时间:2005-06-01  
zzeric 写道
对于log4j来说,Method和行数通过配置properties就可以达到了,而你这样得到的Method和行数并不准确。


这的确是个问题,我也是刚发现的,当时写出代码的时候太以为是了。刚才测试时发现了问题。Method和行数的配置也刚稍微弄明白了一点,确实可以通过配置完成。贴出来大家大家看看对否

%l:输出位置信息,相当于%C.%M(%F:%L);的组合。
%C:输出日志消息产生时所在的类名,如果类名是“test.page.Class1”%C{1}表示输出类名"Class1",%C{2}输出"page.Class1",而%C则输出"test.page.Class1"。
%M:输出日志消息产生时的方法名称
%F:输出日志消息产生时所在的文件名称
%L:输出代码中的行号


zzeric 写道

做为static变量的log在初始化时竟然可以使用non-static的成员变量ste,有点不可思议。

嗯,照着上面代码结合了一下写出来的,我也觉得奇怪
0 请登录后投票
   发表时间:2005-06-09  
呵呵,真是好东西.
0 请登录后投票
   发表时间:2005-06-10  
Reflection.getCallerClass(i)
0 请登录后投票
   发表时间:2005-06-11  
myy 写道
 public static String getCaller();{
    int i;
    StackTraceElement stack[] = (new Throwable(););.getStackTrace();;
    for (i=0; i < stack.length; i++); {
      StackTraceElement ste=stack[i];
        System.out.println(ste.getClassName();+"."+ste.getMethodName();+"(...);");;
      System.out.println(i+"--"+ste.getMethodName(););;
      System.out.println(i+"--"+ste.getFileName(););;
      System.out.println(i+"--"+ste.getLineNumber(););;
    }
  }


通过(new Throwable()).getStackTrace()方法从JAVA栈获得栈帧信息时,应该说java栈的当前帧是关于getStackTrace方法的,怎么会是getCaller方法?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics