锁定老帖子 主题:问个问题:如何知道方法的调用者
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间: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,呵呵 |
|
返回顶楼 | |
发表时间:2005-05-25
楼上好方法,可以不用传类做参数了
|
|
返回顶楼 | |
发表时间:2005-05-26
我用了这个
sun.reflect.Reflection().getCallerClass( int p0); 其中 当p0 = 0 时,表示sun.reflect.Reflection 当p0=1 表示 类本省 当p0=2 表示 调人者 。。。 可是我想,如果要知道是哪个方法就好了,因为他只返回类名阿 |
|
返回顶楼 | |
发表时间: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的回复是从原理上来分析的,很有价值啊。 |
|
返回顶楼 | |
发表时间: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,有点不可思议。 |
|
返回顶楼 | |
发表时间:2005-05-31
多谢了myy!
|
|
返回顶楼 | |
发表时间: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,有点不可思议。 嗯,照着上面代码结合了一下写出来的,我也觉得奇怪 |
|
返回顶楼 | |
发表时间:2005-06-09
呵呵,真是好东西.
|
|
返回顶楼 | |
发表时间:2005-06-10
Reflection.getCallerClass(i)
|
|
返回顶楼 | |
发表时间: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方法? |
|
返回顶楼 | |