【问题标题】:Caller Information in JavaJava中的调用者信息
【发布时间】:2016-01-23 18:47:05
【问题描述】:

在 C# 中,我们有调用者信息

public void DoProcessing()
{
    TraceMessage("Something happened.");
}

public void TraceMessage(string message,
        [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
        [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
        [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
    System.Diagnostics.Trace.WriteLine("message: " + message);
    System.Diagnostics.Trace.WriteLine("member name: " + memberName);
    System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
    System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}

// Sample Output:
//  message: Something happened.
//  member name: DoProcessing
//  source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
//  source line number: 31

MSDN 链接:CallerInfo

我想知道 Java 有没有等价的注解?

这些功能可以帮助我们更好地追踪

更新:

我写了一个类:

public class Trace {

    public static void trace() {
        StackTraceElement[] stk = Thread.currentThread().getStackTrace();
        System.out.println(String.format("LineNumber : %s, ClassName : %s, MethodName : %s, SourceLocation : %s",

                        stk[1].getLineNumber(), stk[1].getClassName(), stk[1].getMethodName(), stk[1].getFileName())


        );
    }

}

并调用 trace() 方法:

public class Main {
    public static void main(String[] args) throws Exception {
        Trace.trace();
    }
}

结果:

LineNumber : 8, ClassName : Trace, MethodName : trace, SourceLocation : Trace.java

对我来说不是这样,我想要这样的结果:

LineNumber : 3, ClassName : Main, MethodName : main, SourceLocation : Main.java

其实我现在想知道类和方法如何调用我的 trace()(父级)

【问题讨论】:

    标签: java c# trace callermembername


    【解决方案1】:

    您创建一个异常并打印它的堆栈跟踪。

    Exception e = new Exception();
    e.printStackTrace();
    //or
    StackTraceElement[] stack = e.getStackTrace();
    StackTraceElement last = stack[0];
    

    编辑:在 cmets Fabian 中提供了更好的解决方案,您不需要创建异常:

    Thread.currentThread().getStackTrace()
    

    【讨论】:

    • 无需创建异常即可获取堆栈跟踪,参见:stackoverflow.com/a/1069074/2991525
    • 我更新了我的帖子,我想要一个类似 trace() 的方法,我不喜欢在每个代码块中调用 getStackTrace()
    • 你当然可以通过 Thread 获取堆栈跟踪,但它 /much/ 比通过 Throwable 慢。
    猜你喜欢
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2010-10-25
    • 2011-04-12
    • 2011-02-22
    相关资源
    最近更新 更多