zoukankan      html  css  js  c++  java
  • Java: 获取当前执行位置的文件名/类名/方法名/行号

    在 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
    
  • 相关阅读:
    Intellij IDEA 关闭阿里编码规约“请不要使用行尾注释”提醒
    VS 进行了无法编译的编辑
    IntelliJ IDEA lombok log 报红
    SQL Server 事务执行SQL
    Linux 检查应用不在现就重启
    Java入门5.2---String类、StringBuffer类、StringBuilder类、System类、Data类、SimpleDataFormat类、Calendar类、Math类、BigInteger类与BigDecimal类
    为什么要进行补偿
    解决flex布局中 space-between方法的排版问题
    桑基图的使用场景
    清蒸罗非鱼的做法和步骤
  • 原文地址:https://www.cnblogs.com/xiaozhang9/p/6666899.html
Copyright © 2011-2022 走看看