Java: 获取当前执行位置的文件名/类名/方法名/行号

摘要:
JAVA程序有时需要获取当前代码位置,因此它们使用线程。currentThread()。getStackTrace()编写以下工具类,用于获取当前执行位置代码的文件名/类名/方法名/行号。当然,同样的信息可以通过newThread()获得。getStackTrace()。处理异常时可以使用此方法。否则,需要一个新线程,这有点浪费。至于为什么CurrentLineI

在 JAVA 程序有时需要获取当前代码位置, 于是就利用 Thread.currentThread().getStackTrace() 写了下面这个工具类, 用来获取当前执行位置处代码的文件名/类名/方法名/行号.

当然通过 new Throwable().getStackTrace() 也能得到同样信息, 在处理异常时用这种方法还行, 否则需要 new 一个 Throwable, 感觉有点浪费​​

至于为什么 CurrentLineInfo.originStackIndex 的值是 2 呢? 这是因为通过自定义的静态方法调用 Thread.currentThread().getStackTrace() 获取当前函数栈时, 已多加了两层方法调用.

比如说在 Main.main() 方法中获取当前行号时, 其调用链为:

Main.main() --> CurrentLineInfo.getLineNumber() --> Thread.getStackStrace()

因为栈是 先入后出 (队列是 先入先出), 所以最初调用位置的函数栈下表是 2.

这一点在调试时也可以看到:

java debug CurrentLineInfo

下面是源码和测试:

CurrentLineInfo.java:

package com.example.lineno;

public class CurrentLineInfo {
    private static int originStackIndex = 2;

    public static String getFileName() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getFileName();
    }

    public static String getClassName() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getClassName();
    }

    public static String getMethodName() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getMethodName();
    }

    public static int getLineNumber() {
        return Thread.currentThread().getStackTrace()[originStackIndex].getLineNumber();
    }
}

测试代码 Main.java:

package com.example.lineno;

public class Main {
    public static void main(String[] args) {
        System.out.println(CurrentLineInfo.getFileName());
        System.out.println(CurrentLineInfo.getClassName());
        System.out.println(CurrentLineInfo.getMethodName());
        System.out.println(CurrentLineInfo.getLineNumber());
    }
}

测试输出:

FileName: Main.java
ClassName: com.example.lineno.Main
MethodName: main
LineNumber: 8

免责声明:文章转载自《Java: 获取当前执行位置的文件名/类名/方法名/行号》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇SpringBoot静态资源存放位置如何使用Linux套接字?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

delphi如何保存和读取utf8的文本文件

delphi如何保存和读取utf-8的文本文件 原文来自: 100脚本网 delphi保存读取utf-8的文本文件给客户做了一个批量识别图像并合成双层pdf的程序,最后客户需要生成的同时附带一份记事本文件,就是OCR过后的文本,并指定utf-8格式的。在处理utf-8时出现了点小问题,现在总结如下 首先 利用delphi自带的UTF8Encode函数,将普...

Swift 自定义Useragent

Swift 自定义Useragent 背景 最近在接阿里云的WAF,防火墙会拦截某些请求。被拦截的请求是看不到Headers信息的,只能看到Useragent,所以,应后台需求,自定义Useragent,这样可以更方便从服务器日志定位问题。 准备 当前项目中使用的是Alamofire进行网络请求。 通过查看源码发现,默认的SessionManager是初始...

js 处理 xml对象和String字符串之间的转换

/** * xml工具 * xml对象和String字符串之间的转换 * ///convert string to xml object (将字符串转换成xml对象) function string2XML(xmlString) { //所有浏览器统一用这种方式处理(因为高版本的浏览器都支持) let parser = new DOM...

AccountManager教程

API阅读 此类提供所述用户接口到集中登记帐户。 用户只需输入一次帐号password后,您将能够访问internet资源。 不同的在线服务用不同的方式来管理用户,所以account manager 型的账户提供了统一验证管理的方法,处理有效的账户的具体信息而且实现排序。比方Google,Facebook。Microsoft Exchange 各自有...

6、jeecg 笔记之 自定义excel 模板导出(一)

1、前言 jeecg 中已经自带 excel 的导出导出功能,其所使用的是 easypoi,尽管所导出的 excel 能满足大部分需求, 但总是有需要用到自定义 excel 导出模板,下文所用到的皆是 easypoi 提供的,为方便下次翻阅,故记之。 2、代码部分 2.1、controller @RequestMapping("/myExcel")...

Springboot 解析 json 并返回+ Jsoup介绍及解析常用方法

1、配置pom.xml <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.11.2...